1

次のような簡単なコードがあります。

class TempClass 
{  
    {    
        System.out.println("inside static...");
    }

    TempClass()
    {
        System.out.println("inside constructor...");
    }

    public static void main(String [] args)
    {
        new TempClass();
    }
}

出力は次のように表示されます:内部静的...内部コンストラクター...

しかし、インスタンス作成行にコメントを付けると、空白の出力が表示されます。そのため、コンストラクターへの呼び出しがあるたびに静的ブロックとして機能します。static の書き込みは必須ではないということですか (クラスがインスタンス化されている場合) ?

誰でもこの動作について何か知っていますか?

4

4 に答える 4

8
{
      System.out.println("inside static...");
}

... はstaticブロックではなく、インスタンス ブロックです。

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

...staticブロックになります。

于 2013-08-05T12:21:01.713 に答える
6
{
  System.out.println("inside static...");
}

静的ブロックではなく、インスタンスブロックあり、このようなものに変換されます

class TempClass
{  
    TempClass()
    {
        {

           System.out.println("inside static...");
        }
        System.out.println("inside constructor...");
    }
}
于 2013-08-05T12:22:05.850 に答える
1

そうではありませんstatic blockstaticキーワードのないブロックはinstance blocksまたはと呼ばれinitializer blocksます。
Java コンパイラは、イニシャライザ ブロックをすべてのコンストラクタにコピーします。
Javaドキュメントを参照

インスタンス変数の初期化ブロックは、静的初期化ブロックと同じように見えますが、 static キーワードはありません。

Java では、コンストラクターを使用してインスタンス変数を初期化する方法には、初期化ブロックと最終メソッドの 2 つがあります。初期化ブロックの
使用

class Whatever {
   private int myVar ;
   {
     // initialization code goes here
      myvar = 10;
   }
}

最終的な方法を使用します。

class Whatever {
  private int myVar = initializeInstanceVariable();

  protected final int initializeInstanceVariable() {

    // initialization code goes here
    return 10;
  }

}

于 2013-08-05T12:22:51.397 に答える
1

static実際、コードにはブロックがありません。そこにある場合は、インスタンス化せずに実行して出力を取得できます

于 2013-08-05T12:27:52.407 に答える