回答
有一個隱含的調用super()
沒有參數的所有類有一個父 - 這是每個用戶定義在Java類 - 所以明確調用通常不是必需的。但是,如果父項的構造函數接受參數,並且希望指定它們,則可能會使用帶有參數的super()
調用。此外,如果父類的構造需要的參數,它有沒有默認參數的構造函數,你會需要調用super()
與參數(S)。
一個例子,在那裏super()
顯式調用使您能夠框架的標題一些額外的控制:
class MyFrame extends JFrame
{
public MyFrame() {
super("My Window Title");
...
}
}
_也很重要:_superclass_構造函數的調用**必須是_subclass_構造函數中的第一行**。相關信息在這裏:[爲什麼this()和super()必須是構造函數中的第一條語句?](https://stackoverflow.com/questions/1168345/why-do-this-and-super-have-在構造函數中的第一個語句) – informatik01
當你不自己做時,調用父類的空構造函數super()
會自動完成。這就是你在代碼中從來不需要這樣做的原因。它是爲你完成的。
當你的超沒有一個無參數的構造函數,編譯器將需要向super
使用適當的參數。編譯器將確保您正確地實例化類。所以這不是你必須擔心的事。
無論你叫super()
在構造函數或沒有,它不會影響你打電話給你的父類的方法能力。
作爲一個側面說明,有人說,這是一般最好手動打這通電話爲了清楚起見。
另外,請注意,當需要傳遞參數給它時,需要顯式調用'super()'。 –
@SamDufel良好的通話,看我的編輯。 –
我們可以使用超()
如果你的方法來訪問父類成員覆蓋其超類方法之一,則可以通過使用關鍵字super
來調用重寫的方法。您也可以使用super來引用隱藏字段(儘管不鼓勵隱藏字段)。考慮這個類,超類:
public class Superclass {
public void printMethod() {
System.out.println("Printed in Superclass.");
}
}
//這裏是一個子類,稱爲子類,重寫printMethod()
:
public class Subclass extends Superclass {
// overrides printMethod in Superclass
public void printMethod() {
super.printMethod();
System.out.println("Printed in Subclass");
}
public static void main(String[] args) {
Subclass s = new Subclass();
s.printMethod();
}
}
在子類中,簡單名稱printMethod()
是指一個子類中,聲明其覆蓋超類中的一個。因此,要引用從超類繼承的printMethod()
,Subclass必須使用限定名稱,如圖所示使用super。編譯和執行子類打印以下內容:
Printed in Superclass.
Printed in Subclass
第一句話是不正確的,而且這些都不能回答這個問題。 – EJP
我們可以通過使用超級方法
考慮,我們有兩個類,父類和子類,與foo方法的不同實現訪問超類的元素。現在在子類中,如果我們想調用父類的方法foo,我們可以通過super.foo()來實現。我們也可以通過super()方法訪問父元素。
class parent {
String str="I am parent";
//method of parent Class
public void foo() {
System.out.println("Hello World " + str);
}
}
class child extends parent {
String str="I am child";
// different foo implementation in child Class
public void foo() {
System.out.println("Hello World "+str);
}
// calling the foo method of parent class
public void parentClassFoo(){
super.foo();
}
// changing the value of str in parent class and calling the foo method of parent class
public void parentClassFooStr(){
super.str="parent string changed";
super.foo();
}
}
public class Main{
public static void main(String args[]) {
child obj = new child();
obj.foo();
obj.parentClassFoo();
obj.parentClassFooStr();
}
}
- 1. 什麼時候需要從構造函數調用`super`?
- 2. 爲什麼在Objective C構造函數中使用[super init]?
- 3. 爲什麼我調用super()在Java構造函數被標記爲錯誤?
- 4. 爲什麼在調用複製構造函數之前調用構造函數?
- 5. 爲什麼調用基構造函數?
- 6. 在Java類中具有super()和不具有super()函數調用的構造函數之間有什麼區別
- 7. super()在構造函數中的含義是什麼?
- 8. 爲什麼JAVA需要構造函數?
- 9. 根據參數在構造函數中調用不同的super()
- 10. 構造函數super()es6 angularjs
- 11. 爲什麼不能在構造函數中同時使用this()和super()?
- 12. C++爲什麼要調用複製構造函數?
- 13. 在Java中調用super的構造函數聲明
- 14. 您是否將super()調用作爲構造函數的開始?
- 15. 爲什麼allocator在構造函數中?
- 16. 爲什麼要將原型的構造函數設置爲其構造函數?
- 17. 爲什麼構造函數中需要apply()函數
- 18. 爲什麼沒有在fill_n中調用移動構造函數
- 19. 爲什麼在非MonoBehaviour類中調用多個構造函數?
- 20. 爲什麼在虛擬繼承中調用Default構造函數?
- 21. 爲什麼調用複製構造函數而不是移動構造函數?
- 22. 爲什麼我們需要在MSIL中顯式調用父構造函數?
- 23. 爲什麼我們需要在JavaScript中調用父構造函數繼承
- 24. 用super構造函數初始化()
- 25. 爲什麼要在類的構造函數中聲明變量?
- 26. 爲什麼要調用析構函數,但在將對象作爲參數傳遞時不會調用構造?
- 27. 爲什麼Swift構造函數使用命名參數調用?
- 28. 爲什麼不調用主類中的默認構造函數?
- 29. 爲什麼在這裏調用複製構造函數?
- 30. 爲什麼在靜態轉換之後調用構造函數?
備註:擴展'JFrame'可能不是你想要做的。擴展意味着一種關係。除非你正在創建一個新的窗口組件,否則你應該擴展'JComponent'。 – Jeffrey