簡體   English   中英

為什么我們在構造函數中調用super()

[英]Why do we call super() in constructor

我們有一個像這樣的構造函數:

public statusArea()     
{           
   super();         
   add(pageIdentifier);     
}

為什么我們稱之為super呢?

Oracle文檔

使用super(),將調用超類無參數構造函數。 使用super(parameter list),將調用具有匹配參數列表的超類構造函數。

注意:如果構造函數未明確調用超類構造函數,則Java編譯器會自動將調用插入到超類的無參數構造函數中。 如果超類沒有無參數構造函數,則將出現編譯時錯誤。 對象確實具有這樣的構造函數,因此如果對象是唯一的超類,就沒有問題。

super()調用超類的無參數構造函數。

在您的代碼中沒有什么區別,因為如果不這樣做,編譯器將隱式添加super() 通常,如果希望調用父類的特定構造函數,則可以向父類的構造函數添加顯式調用。

父類構造函數的調用必須是子類構造函數的第一行。

調用超類構造函數的語法是

super(); // the superclass no-arg constructor is called

要么:

super(params);//the superclass constructor with a matching params is called

注意:

如果構造函數未顯式調用超類構造函數,則Java編譯器會自動將調用插入到超類的無參數構造函數中。 如果超類沒有無參數構造函數,則將出現編譯時錯誤。 對象確實具有這樣的構造函數,因此如果對象是唯一的超類,就沒有問題。

Java中super關鍵字的目的是允許您訪問實例字段,實例方法或擴展類的超類的構造函數。

由於Java中的每個類都隱式地從Object extend ,因此對不從任何類extend的類的構造函數中的super()調用意味着對Object類中的no-arg構造函數的調用。

即使您沒有將super()調用明確地放在構造函數中,編譯器也會添加一個。

在這里,您可以使用super()為父類(即該類擴展的類)提供初始化任何字段或變量的機會,以便您的子類可以正常工作。 例如,超類可能包含一些您未在子類中使用的字段或變量,但是某些字段或變量是類正常工作所必需的。

在這種情況下, super()調用超類的無參數構造函數,即。 您的班級擴展的那個。

如果使用參數調用super(...) ,則會調用具有匹配參數的超類構造函數。

正如其他人所說,如果您自己不調用super() ,則編譯器將調用它。

僅在以下情況下需要指定要調用的構造函數:

您要調用具有參數的超類構造函數

您想鏈接到同一類中的另一個構造函數,而不是超類構造函數

暫無
暫無

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

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