2012-03-20 15 views
3

以下のコードでは、出力はS1S2です。なぜ私たちはその結果を得ますか?この場合、S1S2の出力はなぜですか?

public class S1 { 
    public static void main(String[] args) { 
     new S2(); 
    } 
    S1(){ 
     System.out.print("S1"); 
    } 
} 
class S2 extends S1{ 
    S2(){ 
     System.out.print("S2"); 
    } 
} 
+1

ルックアップ[コンストラクタチェーン](http://www.leepoint.net/notes-java/oop/constructors/constructor.html)。 –

+0

[SSCCE](http://sscce.org/)の良い質問のために+1。 –

答えて

3

S2はS1を拡張するので、すべてのコンストラクタを最上位の下位順で呼び出すのと同じです。

Javaはまず親オブジェクトS1を作成し、そのコンストラクタを呼び出します。次に、次のオブジェクトS2に移動します.S2はコンストラクタです。

+1

まず、S1から 'Object's'コンストラクタを呼び出します。 – twain249

2

派生クラスのコンストラクタを明示的に、各派生クラスのコンストラクタで、基本クラスのデフォルトコンストラクタへの暗黙の呼び出し

super(); 

がある(super(...)を経由して)その基底クラスのコンストラクタを呼び出していない場合。

2

サブクラスのコンストラクタでは、スーパークラスのデフォルトのコンストラクタへの暗黙の呼び出しがあります。コンストラクタ本体は明示的なコンストラクタ 呼び出しと宣言されるコンストラクタで始まらない場合は、コンストラクタ本体 原始クラスオブジェクトの一部ではありません

:ここ

はスペックからの引用です暗黙的に は、引数を取らない直接の スーパークラスのコンストラクタの呼び出しであるスーパークラスコンストラクタ の呼び出し "super();"で始まるとコンパイラによって想定されています。

関連する問題