私の質問は、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
は可能です。final
static
どちらの意味でも混乱しています。どのメソッドにも属さないコード セクションをどうやって作成すればよいのでしょうか。どうすれば呼び出すことができるのでしょうか。一般的に、この使用法の目的は何でしょうか。あるいは、これに関するドキュメントはどこで見つけることができますか。
ベストアンサー1
static 修飾子を持つコード ブロックはクラス初期化子を表します。static 修飾子を持たないコード ブロックはインスタンス初期化子です。
クラス初期化子は、クラスがロードされたとき (実際にはクラスが解決されたときですが、これは技術的な問題です)、定義された順序で実行されます (単純な変数初期化子と同様に、上から下へ)。
インスタンス初期化子は、クラスがインスタンス化されるときに定義された順序で、コンストラクター コードが実行される直前、スーパー コンストラクターが呼び出された直後に実行されます。
static
から を削除するとint a
、インスタンス変数になり、静的初期化ブロックからアクセスできなくなります。これにより、「非静的変数 a は静的コンテキストから参照できません」というエラーが発生し、コンパイルに失敗します。
static
初期化ブロックからも削除すると、インスタンス初期化子になり、int a
構築時に初期化されます。