[Java] 父類和子類擁有同名的成員變量(fields)的情況



首先,需要明確的是,無論是通過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父類,則改變和獲取的是子類自己的成員變量。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM