web-dev-qa-db-ja.com

Javaの静的ブロックと初期化ブロック?

可能性のある複製:
静的初期化ブロック

次のcodeを考慮してください。

public class Test {
    {
        System.out.println("Empty block");
    }
    static {
        System.out.println("Static block");
    }
    public static void main(String[] args) {
        Test t = new Test();
    }
}

最初にstaticブロックが実行され、次にemptyブロックが実行されることを理解しています。しかし問題は、emptyブロックの実際の有用性を理解できたことがないことです。誰でも実際の例を示すことができます-

  • staticemptyブロックの両方が使用されています
  • staticemptyブロックの両方に異なるユーティリティがあります
78
Anshu

それらは2つの非常に異なる目的のためです。

  • 静的初期化ブロックは、クラスのロード時に呼び出され、インスタンス変数またはメソッドにアクセスできません。 @Prahalad Deshpandeのコメントによると、静的変数の作成によく使用されます。
  • 一方、非静的初期化ブロックはオブジェクトの構築時にのみ作成され、インスタンス変数とインスタンスへのアクセス権を持ち、(@ EJPによって提案された重要な修正に従って)コンストラクターの最初に呼び出されます。スーパーコンストラクターが(明示的または暗黙的に)呼び出されており、beforeその他の後続のコンストラクターコードが呼び出されています。クラスに複数のコンストラクターがあり、すべてのコンストラクターに対して同じ初期化コードが必要な場合に使用されるのを見てきました。コンストラクターと同様に、このブロックでは最終ではないメソッドを呼び出さないでください。

この質問はstackoverflowで何度も回答されているので、同様の質問とその回答を検索して確認することをお勧めします。例: static-initialization-blocks

静的ブロックは、クラスがロードされるたびに実行されます。空のブロックは、クラスをインスタンス化するたびに実行されます。これらを比較してみてください:

1。

public static void main(String[] args) {
    Test t = new Test();
}

2。

public static void main(String[] args) {

}

出力:

1。

静的ブロック
空のブロック

2。

静的ブロック

レイマンの言葉では、静的ブロックはonceと呼ばれるだけで、そのタイプのオブジェクトをいくつ作成しても関係ありません。

24
arshajii