![](/img/trans.png)
[英]How is dynamic polymorphism useful when I cant call derived class methods with base class reference
[英]dynamic polymorphism reference pointing to base class
我需要澄清Java的動態多態性。
class Foo {
int a=3;
public void display() {
System.out.println(" in foo "+a);
}
}
class Bar extends Foo {
int a=8;
public void display() {
System.out.println(" in boo "+a);
}
}
public class Tester {
public static void main(String[]args) {
Foo f = new Bar();
f.display();
System.out.println(f.a);
}
}
這里當我創建一個帶有基類引用的子類對象時,在調用方法f.display()
它給出了in boo 8
的輸出。 這是因為動態多態性在運行時檢查對象類型以調用方法。
現在在打印fa
它打印3因為變量無法在java中被覆蓋,這稱為隱藏。這就是它顯示基本變量值而不是子變量值的原因。
現在我的問題是f是基類的引用,它指向子類對象。 然后fa
如何指向基本變量。 場景背后會發生什么? 引用如何指向基類?
(我知道規則,但我想知道如何/為什么?)
我不知道這是否超出了你的學習范圍,但在這里。 編譯代碼時,編譯器會生成JVM執行的字節代碼。
Foo.a
中fa
的字段Foo.a
的引用
System.out.println(f.a);
被編譯到
getfield #6 // Field Foo.a:I
其中getfield
是一個字節碼指令
獲取對象objectref的字段值,其中字段由常量池索引中的字段引用標識(index1 << 8 + index2)
和恆定的池
Constant pool:
// [...]
#6 = Fieldref #20.#24 // Foo.a:I
// [...]
因此,字節代碼引用類Foo
的字段,即變量的聲明類型,而不是實例的運行時類類型。
您可以使用以下命令查看生成的字節代碼
javap -c -v YourClass
這是因為您在問題中已經說明了這一點:
變量不能在Java中重寫
因此,引用fa
在編譯時靜態解析,它將編譯器帶到Foo.a
,即3
。
因為變量不能被覆蓋,所以你從基類中給出了它的原因
print f.a = 3
如果你這樣宣布
Bar f = new Bar();
現在你打印fa
的值給它8
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.