[英]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.