Java預設建構函式的一些發現
阿新 • • 發佈:2018-12-31
程式1:
package com.org.demos;
public class Base {
public Base(){
System.out.println("this is a Base Class!");
}
}
程式2:
package com.org.demos;
public class Child extends Base {
public Child () {
System.out.println("Child Class!");
}
public Child (String str) {
// super();
System.out.println("this is another constructor!" + str);
}
public static void main(String[] args) {
Child child = new Child ();
}
}
上面的是兩個很簡單的程式說明了:如果繼承父類的子類沒有顯示的呼叫super();子類的建構函式中仍然會自動先呼叫父類的無參建構函式。當然也可以自己新增有參的,如:super( int a);
如果在主函式中通過有參建構函式例項化,也會預設的先執行父類的無參建構函式。這在以後的繼承是需要注意。另外補充一點,Java中不支援多繼承。
程式3:
package com._09._30;
class Meal{
public Meal(){
System.out.println("Meal constructor!");
}
}
class Bread{
public Bread(){
System.out.println("Bread constructor!");
}
}
class Cheese{
public Cheese(){
System.out.println("Cheese constructor!");
}
}
class Lunch extends Meal{
public Lunch(){
System.out.println("Lunch constructor!");
}
}
public class ConstructorDemo extends Lunch{
public ConstructorDemo(){
//super();
new Bread();
new Cheese();
new Lunch();
System.out.println("ConstructorDemo constructor!");
}
public static void main(String[] args) {
new ConstructorDemo();
}
}
下面這段程式邏輯上或許看起來比上面的稍微複雜一點,其實本質上還是預設構造器的呼叫(子類總是會呼叫父類的構造器,不管程式設計師是否顯示的使用super();)。在這個程式中,就涉及到構造器的遞迴呼叫,總是先呼叫基類的構造器。對於ConstructorDemo這個類,它的父類往上依次是Lunch、Meal,其中Meal是基類,因此肯定是先預設呼叫基類的構造器,再呼叫Lunch構造器,最後再依次執行ConstructorDemo的構造器中的程式碼。
有一種特殊情況就是當一個類沒有顯示的使用extends繼承任何類的時候,此時該類的預設父類是Object這個超類(當然任何類的基類都是超類),此時會自動呼叫Object的構造器。如果有顯示繼承的話,就像上面的例子,並不會去呼叫Object的構造器。
最後想再補充一點,class A中定義了一個有參的構造器,如果class B想繼承class A,則在class A這個父類中必須重新定義一個無參的構造器(任何定義了構造器的類,系統是不會再提供預設的無參構造器),否則會編譯出錯。原因很簡單,還是上面說的這些,任何子類中的構造器都會預設的呼叫父類中的無參構造器。
如有誤,請拍磚,相互學習!