2011-04-19 13 views
1

は:名前のないJavaコンストラクタ?私はと私は出力を取得しています以下のコードを実行すると

static block 
TEst block 
main block 

どのように文字列「テスト・ブロックは、」印刷されますでしょうか?それはコンストラクタと見なされますか?

public class TestBlk { 

static { 
    System.out.println("static block"); 
} 

{ 
    System.out.println("TEst block"); 
} 


public static void main(String args[]){ 
    TestBlk blk=new TestBlk(); 
    System.out.println("main block"); 

} 
} 

答えて

12

それはデフォルトコンストラクタと一緒に、初期化子インスタンスです。

明示的なコンストラクタのないクラスには、public、no-argsコンストラクタが指定されています。 (おそらく引数を伴う)this()super()又はへのコールなしで

コンストラクタは、(引数なしで、おそらく奇数何かが内部クラスで発生)super()に暗黙の呼び出しを与えられています。

super()への暗黙的または明示的な呼び出しの直後に、フィールドの初期化子およびインスタンスの初期化子内のすべてのコードが、ソースコードの順序で挿入されます。

public class TestBlk { 

    static { 
     System.out.println("static block"); 
    } 

    public TestBlk() { 
     // Call constructor of java.lang.Object. 
     super(); 

     // From instance (and field)initialiser. 
     System.out.println("TEst block"); 

     // Rest of constructor: 
    } 


    public static void main(String args[]){ 
     TestBlk blk = new TestBlk(); 
     System.out.println("main block"); 
    } 
} 
0

あなたがnew TestBlk()を呼び出すときには、オブジェクトの構成の一部として呼び出されます。javacが、それは少しのように見えるあなたのコードで終了した後にそう

2

ここにあるものは、初期化ブロックと呼ばれています。

初期化ブロックは、クラスのオブジェクトが 作成される前に実行される括弧の間 コードのブロックです。

  1. 非静的初期化ブロック:

は、初期化ブロックの2種類があります。

{ System.out.println("TEst block"); }

  • 静的初期化ブロック。

    static { System.out.println("static block"); }

  • より具体的に、私はhereから説明を好む:

    注クラス内の任意の初期化ブロック 存在は、コンストラクタ前 を実行すること。

    我々は初期化ブロックを持っている場合、我々は コンストラクタを必要とする理由だから今の質問は来ます。答えは、我々は、デフォルト コンストラクタが、 がパラメータすることはできませんので、あなたは は、オブジェクトが側面から から値を取ることはできませんので、初期化ブロック がコンストラクタに代わるものではありません初期化ブロックを必要としないです。

    関連する問題