Java中關於子類成員變量與父類成員變量同名的問題

重寫和重載是針對方法的,子類的變量能夠覆蓋父類的變量,可是不能改變父類的變量。java

class Animals {
	int age = 10;
	void enjoy() {
		System.out.println("Animals enjoy!");
	}
	
}
 
class Dogg extends Animals {
	int age = 20;
	int weight;
	void enjoy() {
		System.out.println("Dog enjoy!");
	}
}
 
public class TestDuoTai {
	public static void main(String[] args) {
		Animals a = new Animals();
		a.enjoy();
		System.out.println(a.age);
		
		Dogg d = new Dogg();
		d.enjoy();
		System.out.println(d.age);
		
		Animals d1 = new  Dogg();
		d1.enjoy();		
		System.out.println(d1.age);
		Dogg s = (Dogg)d1;
		System.out.println(s.age);
		
	}
 
}

打印結果:函數

Animals enjoy!
10
Dog enjoy!
20
Dog enjoy!
10
20.net

因而可知,父類和子類的變量是同時存在的,即便是同名。
子類中看到的是子類的變量,父類中看到的是父類中的變量。
它們互相隱藏,而同名的方法則是實實在在的覆蓋(重寫)code

如Animals d1 = new Dogg();
d1是Animals類型的引用,只不過指向子類對象new Dogg() 父類引用指向子類對象就是典型的向上造型,向上造型中,引用能調用什麼方法就看這個引用是什麼類型的(好比d1就只能調用Animals的方法,可是若是此方法被它指向的子類對象進行了重寫,那麼調用的方法就是子類重寫後的形式,這也是多態的表現(動態綁定)) 至於說能調用的屬性也同樣,看引用的類型(不過若是子類有和父類同名的屬性,確實會被覆蓋) 總結:引用只能調用其所屬類中存在的屬性/方法
而訪問成員變量就不一樣了, 由於java中,向上造型呈現的多態性僅僅針對成員函數,成員屬性不具備多態性。能夠看鏈接:https://my.oschina.net/u/3701483/blog/1838913
它是Animals時,訪問的是父類的成員變量,轉型爲Dogg的話,訪問的就是子類的成員變量了。對象

相關文章
相關標籤/搜索