2016-06-12 11 views
0

を呼び出すJavaのコンストラクタのようなステートメントは、自分のコードでオブジェクトインスタンスのコンストラクタのように見えますが、実際はそうではありません。私は、以下の "Hi"プリントのようなステートメントのサンプルをどこで取ったのか完全に忘れていましたが、コンストラクタのように機能しますが、おそらくそうではありません。 TESTSETは、その後に「スーパー」を入れて、スーパークラスを持っているかどうスーパーで

public class TestSet { 
    String hi="Hi"; 
    public TestSet(){ 
     System.out.println("Bye"); 
    } 
    { 
     System.out.println(hi); 
    } 

    public static void main(String s[]){ 
     new TestSet(); 
    } 
} 

は、実際に、「こんにちは」と「さようなら」aaaandを出力し、このコードのコードの「こんにちは」の部分は動作しません。 これはなんですか?私はグーグルにしようとしていましたが、クエリを定式化するのは難しいです。感謝! ありがとう!

+0

こんにちは静的です。;-) –

+0

@StephanBijzitter no。そうではない。 –

+0

NO! –

答えて

2

"ハイ"を印刷するステートメントは、インスタンスイニシャライザブロックにあります。そのブロックはクラスの各コンストラクタの先頭にコピーされ、コンストラクタの本体の前で実行されますが、スーパークラスのコンストラクタが実行された後に実行されます。したがって、new TestSet();Hiの後にByeを出力しますが、スーパークラスコンストラクタ(super())への呼び出しをインスタンス初期化子ブロックに追加することはできません。

+0

先ほどスーパーコンストラクタが呼び出された後、インスタンスブロックが呼び出された場合、コンストラクタから暗黙的に "super"が呼び出された場合はどうなりますか、混乱しています。 –

+0

親クラスを追加しようとしましたが、あなたが記述したとおりに動作します –

+1

@スーパークラスのコンストラクタは常に(明示的または暗黙的に)コンストラクタから呼び出されます(コンストラクタが別のコンストラクタを呼び出さない限り'this()'を使って)、インスタンスイニシャライザブロックのコードの前に呼び出されます。インスタンス初期化子ブロックのコードは、コンストラクタの本体の前に呼び出されます(スーパークラスのコンストラクタの呼び出しは含まれません)。 – Eran