// 注意,這裡不能是 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();
編譯程式就會報告自己找不到一個相符的建構函式。