java類的繼承this調用屬性問題

由於這個地方我有點亂,所以記錄一下。

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是指調用該方法的類

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章