Java的預設建構函式呼叫

findumars發表於2013-08-09
// 注意,這裡不能是 public class OOO,否則編譯無法通過,需把檔案命名成 OOO.java
class OOO {
    // 注意:如果不定義OOO(),那麼Shapes(int i)編譯出錯    OOO() {
        System.out.println(" Construtor() in OOO"); 
    }
    OOO(int i) {
        // this(); // 可以這樣呼叫!
        System.out.println(" Construtor(i) in OOO"); 
    }
}

public class Shapes extends OOO{

    Shapes() {
        super(200); // 必須放在第一行,否則出錯。
        // 呼叫super(200)以後,不再預設呼叫super()了,否則會自動呼叫super()
        // 原因:建構函式通常用於完成一些初始化的工作,比方說類B繼承了類A,類A中有一個name屬性,在類A的建構函式中name 被初始化,如果在類B建構函式中我們沒有先呼叫父類A的建構函式而先使用了未初始化的資源name,將不能得到我們期望的結果,所以人們就會有了這種約定。
        System.out.println(" Construtor() in Shapes"); 
    }

    Shapes(int i) {
        // 還是會預設呼叫super()
        System.out.println(" Construtor(int) in Shapes"); 
    }

    public static void main(String[] args) {
        // 例子1:
        System.out.println("==================ex1==================");
        Shapes s1 = new Shapes();

        // 例子2:
        System.out.println("==================ex2==================");
        Shapes s2 = new Shapes(100);
    }
} 

另外有一篇:java建構函式的執行順序

http://www.blogjava.net/rocket/archive/2008/05/27/203165.html

若建立一個沒有建構函式的類,則編譯程式會幫我們自動建立一個預設建構函式。
如果已經定義了一個建構函式(無論是否有自變數),編譯程式都不會幫我們自動合成一個:
class Bush {
Bush(int i) {}
Bush(double d) {}
}

現在,假若使用下述程式碼:
new Bush();
編譯程式就會報告自己找不到一個相符的建構函式。

相關文章