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