1. 程式人生 > >Java預設建構函式的一些發現

Java預設建構函式的一些發現

程式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這個父類中必須重新定義一個無參的構造器(任何定義了構造器的類,系統是不會再提供預設的無參構造器),否則會編譯出錯。原因很簡單,還是上面說的這些,任何子類中的構造器都會預設的呼叫父類中的無參構造器。

如有誤,請拍磚,相互學習!