搜尋

首頁  >  問答  >  主體

java - 多態呼叫同名成員變量,為何存取的是父類別的成員變數?

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

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

女神的闺蜜爱上我女神的闺蜜爱上我2755 天前989

全部回覆(2)我來回復

  • PHP中文网

    PHP中文网2017-06-12 09:29:03

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

    回覆
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-06-12 09:29:03

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

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

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

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

    回覆
    0
  • 取消回覆