java 欄位覆蓋(field)
欄位的覆蓋:
public class Father { public String name="Father"; public static void main(String[] args) { Son son=new Son(); System.out.println(son.name); Father father=son; System.out.println(father.name); } } class Son extends Father{ String name="Son"; }
此時兩個輸出分別為:
Son
Father
所以說,欄位覆蓋並不會導致父類的的那個欄位沒作用了,當子類例項向上轉型為父類例項時,通過父類例項使用欄位,呼叫的則是父類中的欄位。
不僅僅是向上轉型會這樣,看下面這段程式碼:
public class Father { public String name="Father"; public void print(){ System.out.println(name); } public static void main(String[] args) { Son son=new Son(); son.print(); } } class Son extends Father{ String name="Son"; }
根據我的理解,可以這樣解釋:
Son繼承了Father類,所以繼承了print方法,但是,通過Son的例項呼叫print方法其實相當於
son.super.print(); 其中super就是表示Father類的一個例項,該例項其實就是Son中的一個欄位,即Father super,只不過是隱藏的而已。
當Son的例項要呼叫print方法時,就是用super物件再呼叫print方法。
也就說,其實print方法不直接屬於Son類,只不過當Son沒有重寫print方法時,都會去呼叫Father例項super的print方法。
所以,super物件呼叫print方法所能訪問到的name欄位自然也只能是super物件中的name欄位。。
再通俗點說,super本身就是是Son中的一個欄位,那麼super又怎能直接訪問Son中的其他欄位呢?(除非把Son中其他欄位傳遞進super中)。。
所以,super無法訪問到Son中的name欄位。不過,Son中是可以訪問到super中的name欄位的。。不過當Son中和super中同時存在一個同名的欄位時,通過Son的例項自然是優先訪問Son的欄位。。。如果把Son例項向上轉型為Father例項,此時轉型後的例項訪問同名欄位會變成優先訪問super中的欄位。
以上是我對欄位覆蓋的簡單猜測。。。就是我自己強行解釋欄位覆蓋為什麼那樣。。
方法覆蓋和欄位覆蓋是不一樣的,不論怎樣(父類方法呼叫被覆蓋方法?向上轉型?)所訪問到的都是被覆蓋後的方法。