首先,需要明確的是,無論是通過casting,還是通過將子類對象的reference賦值給父類變量,都無法改變該reference所指對象的真實類型。但當該reference的類型是父類時,將無法調用只存在於子類中的方法。
當子類擁有與父類同名的成員變量時,父類的成員變量並不會被覆蓋,而是與子類的成員變量分別存儲在不同的空間,其值仍然可以被改變和訪問。
如下例:
1 class Employee{ 2
3 private String title = "Employee"; 4
5 public void setTitle(String title) { 6 this.title = title; 7 } 8
9 public String getTitle() { 10 return this.title; 11 } 12
13 } 14
15 class Manager extends Employee{ 16
17 private String title = "Manager"; 18
19 } 20
21 class Director extends Employee{ 22
23 private String title = "Director"; 24
25 public String getTitle() { 26 return this.title; 27 } 28 } 29
30 public class SameName { 31
32 public static void main(String[] args) { 33
34 Employee e = new Employee(); 35 Employee m = new Manager(); 36 Director d = new Director(); 37
38 System.out.println(e.getTitle()); 39
40 //子類Manager的getTitle方法繼承於父類Employee, 41 //因此調用時,訪問的是父類的同名成員變量
42 System.out.println(m.getTitle()); 43
44 //子類Director override父類的getTitle方法, 45 //因此調用時,訪問的是子類自己的成員變量
46 System.out.println(d.getTitle()); 47
48 //子類Director的setTitle方法繼承於父類Employee, 49 //因此調用時,改變的是父類的同名成員變量
50 d.setTitle("President"); 51 System.out.println(d.getTitle()); 52
53 } 54 }
運行輸出結果為
Employee
Employee
Director
Director
因此,當子類的成員變量與父類同名時,若對該成員變量進行操作的方法繼承於父類,則改變和獲取的是父類的成員變量。
若對該成員變量進行操作的方法為子類所獨有,或override父類,則改變和獲取的是子類自己的成員變量。