3 回答
TA貢獻1951條經驗 獲得超3個贊
首先是一些術語:
無參數構造函數:無參數的構造函數;
可訪問的無參數構造函數:超類中的無參數構造函數對子類可見。這意味著它是公共的或受保護的,或者,如果兩個類都在同一個包中,則訪問包;和
默認構造函數:類中沒有顯式構造函數時,編譯器添加的公共no-args構造函數。
因此,所有類都至少具有一個構造函數。
子類的構造函數可以在執行子類的構造函數中的代碼之前,首先指定要調用超類中的哪個構造函數。
如果子類構造函數未指定要調用的超類構造函數,則編譯器將自動調用超類中可訪問的no-args構造函數。
如果超類沒有no-arg構造函數或不可訪問,則未指定要調用的超類構造函數(在子類構造函數中)是編譯器錯誤,因此必須指定。
例如:
public class Base { }
public class Derived extends Base { }
這很好,因為如果不顯式添加構造函數,則Java會為您放置一個公共的默認構造函數。
public class Base { }
public class Derived extends Base { public Derived(int i) { } }
還可以
public class Base { public Base(String s) { } }
public class Derived extends Base { }
上面是編譯錯誤,因為Base沒有默認構造函數。
public class Base { private Base() { } }
public class Derived extends Base { }
這也是一個錯誤,因為Base的no-args構造函數是私有的。
TA貢獻1804條經驗 獲得超8個贊
調用無參數的超級構造函數只會浪費屏幕空間和程序員時間。無論您是否編寫,編譯器都會生成完全相同的代碼。
class Explicit() {
Explicit() {
super();
}
}
class Implicit {
Implicit() {
}
}
更新(2018年12月):
編寫顯式super()代碼有助于在IDE中導航源代碼。
截至2018年12月,Eclipse和IntelliJ均未提供任何從派生類的構造函數導航到基類的構造函數的方法。
TA貢獻1847條經驗 獲得超11個贊
即使不調用子默認構造函數,也會調用默認父構造函數。
主要
public class Main {
public static void main(String[] args) {
A a = new B();
}
}
一種
public class A {
public A() {
System.out.println("A");
}
}
乙
public class B extends A {
public B() {
System.out.println("B");
}
}
版畫
A
B
添加回答
舉報
