[英]Why do we call super() in constructor
我們有一個像這樣的構造函數:
public statusArea()
{
super();
add(pageIdentifier);
}
為什么我們稱之為super
呢?
使用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.