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 Test { 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); } }
因而可知,父類和子類的變量是同時存在的,即便是同名。
子類中看到的是子類的變量,父類中看到的是父類中的變量。
它們互相隱藏,而同名的方法則是實實在在的覆蓋(重寫)。java
如Animals d1 = new Dogg();
d1便是一個Animals的對象,也是一個Dogg的對象,
那麼調用方法時,是根據對象的實際類型調用的,
實際類型是Dogg,因此永遠調用子類的方法。this
而訪問成員變量就不一樣了,它是Animals時,訪問的是父類的成員變量,
轉型爲Dogg的話,訪問的就是子類的成員變量了。code
public class CallByValue { Customer c1 = new Customer("張三"); some(c1); System.out.println(c1.name);//結果是李四 Customer c2 = new Customer("趙六"); other(c2); System.out.println(c2.name);//結果是趙六 static void some(Customer c){ c.name = "李四"; } static void other(Customer c){ c = new Customer("王五");//創建新對象指定給c參考,本來參考的對象會被清除 } } class Customer{ String name; public Customer(String name) { this.name = name; } }
Java中只有傳值調用,在some方法中,c和c1參考的是同一對象,即c.name修改的是同一對象的變量。
在調用other()方法時,c和c2參考的是同一對象,在c = new Customer("王五")這一句就是要求創建新對象,並指定給c參考,即c和c2變成了兩個不一樣的對象。對象