封面
最近想到了一個問題,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)訪問。
那么,怎樣去訪問隱藏字段呢?有兩種方法可以供選擇:
就像上面的例子的c2.s一樣,通過申明父類去調用
將子類強制轉化成父類型再來調用:((Super)c1).s
最后,實際開發(fā)中就不要申明隱藏字段了,畢竟這種代碼容易引起誤解。