簡體   English   中英

指向基類的動態多態性引用

[英]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.afa的字段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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM