簡體   English   中英

創建基類對象時的運行時多態性

[英]Runtime polymorphism while creating base class object

請考慮以下代碼。

class Base{
  Base() {  
      print();   
  }
  void print() { 
      System.out.println("Base"); 
  }
}

class Child extends Base{
   int i =   4;
   public static void main(String[] args){
      Base base = new Child();
      base.print();
   }
   void print() { 
       System.out.println(i); 
   }
}

該程序將打印0,4。

我理解的是,將根據實際對象的類來選擇要執行的方法,因此在這種情況下是Child 因此,當調用Base的構造函數時,調用Child print方法,這樣就會打印0,4。

請告訴我是否理解正確嗎? 如果是,我還有一個問題,而基類構造函數正在運行JVM如何調用Child的方法,因為沒有創建Child的對象?

[...]將根據實際對象的類別選擇要執行的方法

是的,您的理解是正確的:根據正在創建的對象的類型選擇方法,因此調用將發送到Child.print()而不是Base.print()

Base類構造函數是如何運行的,因為JVM可以調用Child的方法,因為沒有創建Child的對象?

Base的構造函數正在運行時,已經創建了 Child對象。 但是,它尚未完全初始化 這正是避免調用可以在構造函數內部覆蓋的方法的原因:語言允許它,但程序員在執行時應該格外小心。

有關基類構造函數調用可覆蓋方法時可能發生的問題的更多信息,請參閱此問答

將根據實際對象的類來選擇要執行的方法

對,那是正確的。

Base base = new Child();

while Base class constructor is running how come JVM can call Child's method since Child's object is not created?它不會發生這種情況while Base class constructor is running how come JVM can call Child's method since Child's object is not created? 它發生了。 這里發生的是,創建了Child實例,並且當Child實例通過Child的默認構造函數創建時,它首先調用that is where the 0 get printed的超級構造函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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