1. 程式人生 > >java 欄位覆蓋(field)

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中的欄位。

 

以上是我對欄位覆蓋的簡單猜測。。。就是我自己強行解釋欄位覆蓋為什麼那樣。。

方法覆蓋和欄位覆蓋是不一樣的,不論怎樣(父類方法呼叫被覆蓋方法?向上轉型?)所訪問到的都是被覆蓋後的方法。