2014-02-26 31 views
0

編寫程序時遇到了一些意想不到的結果。我有三個類,它們都可以正確編譯,但是當我把它們弄糟時,它們似乎沒有將正確的輸出寫入控制檯。根據我的主要方法,我應該得到的結果顯示:主要調用太多類?

Extender called 
ClassTest called 

但是,寫着:

AbsClass called 
Extender called 
ClassTest called 

我在ClassTest類的構造函數使用super(),但應該只調用父上課,對吧?

這裏的第一類:

public abstract class AbsClass { 
    public AbsClass() { 
     System.out.println("AbsClass called"); 
    }   
} 

這裏是第二類:

public class Extender extends AbsClass { 
    public Extender() { 
     System.out.println("Extender called"); 
    } 
} 

這裏的最後類的主要方法:

public class ClassTest extends Extender { 
    public ClassTest() { 
     super(); 
     System.out.println("ClassTest called"); 
    } 

    public static void main(String[] args){ 
     ClassTest test = null; 
     test=new ClassTest(); 
    } 
} 
+2

_「如果構造函數沒有明確調用超類的構造函數,那麼Java編譯器會自動插入對超類的無參構造函數的調用。」#http://docs.oracle.com/javase/tutorial/java /IandI/super.html –

+0

我收到你期待的結果....有什麼問題嗎?你知道如何編譯和運行java? –

+0

@Suzon我知道如何編譯和運行,但我得到了我寫的後一個結果。 – liberation

回答

2

如果你繼承類,構造函數總是要求所有的祖先。

如果您不指定它與super(parameters),則默認調用super()

請注意,如果祖先具有帶參數的構造函數,並且沒有沒有參數的構造函數,並且其擴展類未指定他想調用哪個構造函數,則代碼變得不可編譯。

例子:

public abstract class AbsClass { 
    public AbsClass(String text) { 
     System.out.println("AbsClass called: " + text); 
    }   
} 

public class Extender extends AbsClass { 
    public Extender() { 
     System.out.println("Extender called"); 
    } 
} 

是不是編譯。

(重要的東西:如果類沒有構造,有隱含自動創建構造函數不帶任何參數)

2

如果您有不顯式調用開始this()super(),然後構造編譯器會自動插入對默認超類構造函數的調用。從Java Language Specification (§8.8.7)

如果構造體不明確的構造函數調用,並正在申報的構造開始不是原始類對象的一部分,然後在構造函數體含蓄與超類構造函數調用「超級開始( );「,它的直接超類的構造函數的調用不帶任何參數。

因此,默認構造函數AbsClass()Extender的構造函數開始執行時被調用。