静的初期化コードブロックと非静的初期化コードブロックの違いは何ですか?質問する

静的初期化コードブロックと非静的初期化コードブロックの違いは何ですか?質問する

私の質問は、static キーワードの特定の使用法についてです。キーワードを使用して、どの関数にも属さないクラス内のコード ブロックをカバーすることができますstatic。たとえば、次のコードはコンパイルされます。

public class Test {
    private static final int a;    
    static {
        a = 5;
        doSomething(a);
    }
    private static int doSomething(int x) {
        return (x+5);
    }
}

キーワードを削除すると、static変数aが であるためエラーが発生します。ただし、キーワードとキーワードの両方を削除してコンパイルすることfinalは可能です。finalstatic

どちらの意味でも混乱しています。どのメソッドにも属さないコード セクションをどうやって作成すればよいのでしょうか。どうすれば呼び出すことができるのでしょうか。一般的に、この使用法の目的は何でしょうか。あるいは、これに関するドキュメントはどこで見つけることができますか。

ベストアンサー1

static 修飾子を持つコード ブロックはクラス初期化子を表します。static 修飾子を持たないコード ブロックはインスタンス初期化子です。

クラス初期化子は、クラスがロードされたとき (実際にはクラスが解決されたときですが、これは技術的な問題です)、定義された順序で実行されます (単純な変数初期化子と同様に、上から下へ)。

インスタンス初期化子は、クラスがインスタンス化されるときに定義された順序で、コンストラクター コードが実行される直前、スーパー コンストラクターが呼び出された直後に実行されます。

staticから を削除するとint a、インスタンス変数になり、静的初期化ブロックからアクセスできなくなります。これにより、「非静的変数 a は静的コンテキストから参照できません」というエラーが発生し、コンパイルに失敗します。

static初期化ブロックからも削除すると、インスタンス初期化子になり、int a構築時に初期化されます。

おすすめ記事