java - 多態呼叫同名成員變量,為何存取的是父類別的成員變數?
女神的闺蜜爱上我
女神的闺蜜爱上我 2017-06-12 09:27:03
0
2
913

剛開始猜測,由於父類別和子類別的成員變數在堆中各存一份,可能是父類別的存在上面,因此先找到的父類別的成員變數。然後測試了一下,程式碼如下:

package test;

public class Polymorphism {
    public static void main(String[] args) {
        F f = new Z();
        f.show();
        System.out.println("f:"+f);
        System.out.println("f:"+f.a);
    }
}

abstract class F{
    int a = 10;
    public abstract void show();
}
class Z extends F{
    int a = 5;
    public void show(){
        System.out.println("Z:"+this);
        System.out.println("Z:"+this.a);
    }
}

輸出為:
Z:test.Z@15db9742
Z:5
f:test.Z@15db9742
f:10

f與this指向同一個物件存取同一個變數結果卻不同,所以我上邊的猜測應該是錯的。那究竟是什麼原因導致多態呼叫同名成員變量,訪問的是父類別的成員變量這種情況?

女神的闺蜜爱上我
女神的闺蜜爱上我

全部回覆(2)
Ty80

f指的是子類別物件。只聽過方法的重寫和重載,沒有類變數的重寫和重載吧,我運行的程序,它分情況了,如果是調用方法,就是實際所指的對象(這裡實際對像是子類物件Z)的方法,如果是類別變數同名了,就是生命物件的類別變數值。

扔个三星炸死你

java中方法的重寫,重載與動態連結構成多態,多態就是同一個事物的不同表現。

你這個例子是方法的重寫表現出來的多態性。

聲明的是父類F,實際上指向他的子類Z,這個時候是相當於一個向上型別轉換,因為Z也是由F繼承過來的,所以可以向上轉型,現在Z是F型的。

所以這裡f變數由Z實例化出來的,但是它是F型的,表現出來的是F的特性。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!