簡體   English   中英

超級構造函數調用

[英]Super constructor call

在Java中,如果我的類擴展了一個超類,並且默認情況下,構造函數的第一行是Super() ,那么超類的字段是否已初始化,或者僅構造函數在運行?

另外,如果超類中的構造函數調用了恰好在兩個類中的方法,那么它是否運行超類或子類版本?

在Java中,如果我的類擴展了超類,並且默認情況下構造函數的第一行是Super(),那么超類的字段是否已初始化? 還是只是構造函數運行?

超類的字段始終在超類構造函數主體運行之前初始化。

有關詳細信息,請參見JLS的15.9.4節12.5節

另外,如果超類中的構造函數調用了恰好在兩個類中的方法,那么它是否運行超類或子類版本?

假設子類方法實際上覆蓋了超類一,則將調用子類實現。 通常將其視為壞事,因為這意味着該方法不能依賴子類構造函數初始化的任何內容。

初始化超類的字段,還是僅運行構造函數?

這是同一件事。 調用構造函數時,會發生以下事情:

  1. 除非當前類為java.lang.Object ,否則將調用超類構造函數。
  2. 執行帶有初始化程序和任何匿名初始化程序{ }的實例變量聲明。
  3. (隱式或顯式) super()調用之后的構造函數中的代碼將被執行。

您可以在調用super()時通過遞歸看到,步驟(2)在步驟(3)之前。 因此,是的,實例變量已初始化構造函數代碼已執行。

另外,如果超類中的構造函數調用了恰好在兩個類中的方法,那么它是否運行超類或子類版本?

子類版本。 請注意,這與C ++有所不同,在C ++中,對象被視為部分構造,與v-table,因此將運行超類版本。

暫無
暫無

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

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