1. ホーム

[解決済み】静的初期化コードブロックと非静的初期化コードブロックの違いは何ですか?

2022-03-25 04:43:17

質問

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

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

を削除すると static キーワードを使用すると、変数 afinal . しかし finalstatic というキーワードを入力し、コンパイルさせます。

どっちもどっちで困惑しています。どのメソッドにも属さないコードセクションをどのように持てばいいのでしょうか?どのようにそれを呼び出すことが可能なのでしょうか?一般的に、この使い方の目的は何ですか?あるいは、これに関するドキュメントはどこにあるのでしょうか?

どのように解決するのですか?

static修飾子がついたコードブロックは クラス イニシャライザー、static修飾子なしのコードブロックは インスタンス のイニシャライザーです。

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

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

を削除した場合 static から int a この場合、インスタンス変数になり、スタティック・イニシャライザー・ブロックからアクセスすることはできません。この場合、コンパイル時に "非静的変数 a cannot be referenced from a static context" というエラーが出て失敗します。

また static はインスタンス・イニシャライザーになり、その結果 int a は構築時に初期化されます。