重寫和重載是針對方法的,子類的變量能夠覆蓋父類的變量,可是不能改變父類的變量。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的話,訪問的就是子類的成員變量了。對象