由於這個地方我有點亂,所以記錄一下。
public class NotOverriding extends Base{
private int i=2;
public static void main(String[] args){
NotOverriding no=new NotOverriding();
no.increase();
System.out.println(no.i);
System.out.println(no.getI());
}
}
class Base{
private int i=100;
public void increase(){
this.i++;
}
public int getI(){
return this.i;
}
}
輸出結果:
2
101
原因:當有類的繼承時,父類會先檢查子類有無重寫本類方法,當子類重寫父類方法,父類會動態綁定實現多態。而當子類沒有重寫父類方法時,便會調用父類的原方法,而此時方法裏的this則是指父類本身,若此時在這個原方法內又調用一個子類重寫了的方法,則又會動態綁定實現子類的方法,此時則指向子類。
public class NotOverriding extends Base{
private int i=2;
public void decline() {
this.i--;
}
public int getI(){
return this.i;
}
public int getSuperI() {
return super.getI();
}
public static void main(String[] args){
NotOverriding no=new NotOverriding();
no.increase();
System.out.println(no.i);
System.out.println(no.getI());
System.out.println(no.getSuperI());
}
}
class Base{
private int i=100;
public void increase(){
this.i++;
this.decline();
}
public int getI(){
return this.i;
}
public void decline() {
this.i--;
}
}
此時輸出結果:
1
1
101
再來一個例子
class Animal{
int x = 5;
public int returnx(){
return this.x;
}
}
class Dog extends Animal{
int x = 3;
public int returnx(){
return this.x;
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Dog();
System.out.println(a.x);
System.out.println(a.returnx());
}
}
綜上,變量調用的是子類重寫後的方法還是父類的原方法,由變量所指向的對象實例的類型決定,而不是由變量本身的類型決定。this是指調用該方法的類!