簡體   English   中英

覆蓋從構造函數調用的方法

[英]Overriding a method that is called from a constructor

如果創建了子類的實例,則輸出為sub0 sub2

關於此的兩個問題:

  • 為什么即使超類構造函數沒有完成,也會調用子類方法?

  • 為什么從超類構造函數( sub0輸出)調用時,實例字段未初始化?

例:

class Superclass{
   int i = 1;

    Superclass(){
      aMethod();
    }
   void aMethod(){
      System.out.println("super" + i);
   }
}

class Subclass extends Superclass{
   int i = 2;

   Subclass(){
   aMethod();
   }

   void aMethod(){
      System.out.println("sub" + i);
   }
}

為什么即使超類構造函數沒有完成,也會調用子類方法?

因為已經在那個時間點創建了子類的實例。 只需調用超類構造函數即可初始化對象的狀態。 現在,因為實例實際上是子類的實例(我假設你只討論這種情況),所調用的實際方法將是重寫的方法(此處適用的方法覆蓋規則)。

為什么在從超類構造函數(sub0輸出)調用時,實例字段未初始化?

因為,子類構造函數尚未啟動初始化部分。 它是首先執行的超類構造函數。 因此,如果從超類構造函數調用子類中的重寫方法,則子類的字段尚未初始化,並且i的值仍為0

也可以看看:

暫無
暫無

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

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