剛開始猜測,由於父類別和子類別的成員變數在堆中各存一份,可能是父類別的存在上面,因此先找到的父類別的成員變數。然後測試了一下,程式碼如下:
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指向同一個物件存取同一個變數結果卻不同,所以我上邊的猜測應該是錯的。那究竟是什麼原因導致多態呼叫同名成員變量,訪問的是父類別的成員變量這種情況?
PHP中文网2017-06-12 09:29:03
f指的是子類別物件。只聽過方法的重寫和重載,沒有類變數的重寫和重載吧,我運行的程序,它分情況了,如果是調用方法,就是實際所指的對象(這裡實際對像是子類物件Z)的方法,如果是類別變數同名了,就是生命物件的類別變數值。
扔个三星炸死你2017-06-12 09:29:03
java中方法的重寫,重載與動態連結構成多態,多態就是同一個事物的不同表現。
你這個例子是方法的重寫表現出來的多態性。
聲明的是父類F,實際上指向他的子類Z,這個時候是相當於一個向上型別轉換,因為Z也是由F繼承過來的,所以可以向上轉型,現在Z是F型的。
所以這裡f變數由Z實例化出來的,但是它是F型的,表現出來的是F的特性。