Java中方法的重寫與成員變量的隱藏


這篇文章討論了Java面向對象概念中一個基本的概念–Field Hiding(隱藏成員變量)

在討論這個問題之前,我們看一段特別特別簡單的代碼,請問一下方法的數據結果是什么?

public class FieldOverriding { 
 
    public static void main(String[] args) { 
        Sub c1 = new Sub(); 
        System.out.println(" c1.s : " + c1.s); 
        System.out.println(" c1.say : " + c1.say()); 
 
        Super c2 = new Sub(); 
        System.out.println(" c2.s : " + c2.s); 
        System.out.println(" c2.say : " + c2.say()); 
    } 
} 
 
class Super { 
    String s = "Super"; 
 
    String say(){ 
        return "hello Super"; 
    } 
} 
 
class Sub extends Super { 
    String s = "Sub"; 
 
    String say(){ 
        return "hello Sub"; 
    } 
} 

輸出結果:

c1.s : Sub 
c1.say : hello Sub 
c2.s : Super 
c2.say : hello Sub 

 

和你想的一樣嗎,如果一樣的話,那就不用繼續往下看了。因為這個本來就不難,知道了就行。

Java中的重寫

在深入理解Java中的重寫和重載中我們介紹過:

在Java的子類與父類中有兩個名稱、參數列表都相同的方法的情況。由於他們具有相同的方法簽名,所以子類中的新方法將覆蓋父類中原有的方法。

正式因為Java在繼承中有方法的重寫,所以,這也體現了Java的動態多態性。

成員變量在Java中能夠被重寫么?

上面的Java的重寫介紹中明確的說了,重寫,指的是方法。並沒有提到成員變量。通過上面的例子,其實我們也可以發現,成員變量並沒有被重寫。

所以,Java中,成員變量並不會被重寫。這里就有另外一個詞:隱藏。

Java中成員變量的隱藏

Java文檔中對隱藏域的定義:

Within a class, a field that has the same name as a field in the superclass hides the superclass’s field, even if their types are different. Within the subclass, the field in the superclass cannot be referenced by its simple name. Instead, the field must be accessed through super. Generally speaking, we don’t recommend hiding fields as it makes code difficult to read.

翻譯成中文:

在一個類中,子類中的成員變量如果和父類中的成員變量同名,那么即使他們類型不一樣,只要名字一樣。父類中的成員變量都會被隱藏。在子類中,父類的成員變量不能被簡單的用引用來訪問。而是,必須從父類的引用獲得父類被隱藏的成員變量,一般來說,我們不推薦隱藏成員變量,因為這樣會使代碼變得難以閱讀。

其實,簡單來說,就是子類不會去重寫覆蓋父類的成員變量,所以成員變量的訪問不能像方法一樣使用多態去訪問。

如何訪問被隱藏的成員變量

其實,通過前面的例子,和剛剛關於成員變量的介紹,其實你已經知道了如何訪問被隱藏的成員變量。 就是使用父類的引用來訪問成員變量,如Super c2 = new Sub(); System.out.println(" c2.s : " + c2.s);。或者使用System.out.println(((Super)c1).s);。


免責聲明!

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



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