你真的了解Override嗎,屬性能夠被重寫嗎?

封面

最近想到了一個問題,Java的屬性能夠被Override嗎?首先讓我們看一下下面這個繼承的例子。

class Super {
    String s = "Super"; }

class Sub extends Super {
    String s = "Sub"; }

public class FieldOverriding {
    public static void main(String[] args) {
        Sub c1 = new Sub();
        System.out.println(c1.s);

        Super c2 = new Sub();
        System.out.println(c2.s);
    }
}

你覺得輸出的結果會是什么?答案跟我們預料的一樣,輸出結果如下:

Sub 
Super

不覺得奇怪嗎?我們確實創(chuàng)建了兩個Sub對象,但是為什么第二個輸出的結果卻是Super。Override在你心目中是不是一個驚嘆號? 還是一個句號? 你腦袋里是不是充滿了問號?

上面的例子中定義了一個隱藏字段。在類中,與父類中的字段具有相同名稱的字段為隱藏字段,即使它們的類型不同。在子類中,父類中的字段不能通過其簡單名稱引用。相反,該字段必須通過父類訪問。一般來說,我們不建議隱藏字段,因為它使代碼難于閱讀。

從這個定義中,成員字段不能像方法一樣被重寫。當子類定義具有相同名稱的字段時,該子類僅聲明一個新字段。超類中的字段是隱藏的。它沒有被重寫,所以它不能被多態(tài)訪問。

那么,怎樣去訪問隱藏字段呢?有兩種方法可以供選擇:

  1. 就像上面的例子的c2.s一樣,通過申明父類去調用

  2. 將子類強制轉化成父類型再來調用:((Super)c1).s

最后,實際開發(fā)中就不要申明隱藏字段了,畢竟這種代碼容易引起誤解。

歡迎關注我的公眾號“java工會”,一起交流技術

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容