Javaの静的についてほとんど質問がありません
非静的クラスに静的ブロックを含めることはできますか??その(非静的)クラスのオブジェクトが他のクラスで初期化された場合、静的ブロックは実行されますか??
静的ブロックと変数( int a = 3) および main() メソッドを持つ静的クラスがあり、それが実行される場合、変数の初期化が最初に行われますか、それとも静的ブロックの実行ですか?私は静的ブロックがメインの前に実行されることを知っています() 方法。
こちらをご覧くださいhttp://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
仕様では静的初期化子と呼ばれています。このコードは、JVM がクラスをロードするときに実行されます。ランタイム システムは、静的初期化ブロックがソース コードに現れる順序で呼び出されることを保証します。
非静的内部クラスで静的コードを使用することはできません。
public class MyClass {
static {
System.out.println("static code from nonstatic class");
}
class In {
/* it will not compile
static {
}
*/
}
static class In2 {
static {
System.out.println("static code from static inner class");
}
}
public static void main(String[] args) {
MyClass c = new MyClass();
}
}
呼び出し順序の詳細については、Java® 言語仕様の詳細な初期化手順を参照してください。単純に、静的ブロックはソース コードに表示される順序で実行されます。
質問 2 については、Java 言語仕様 §12.4.2の「詳細な初期化手順」の特にステップ 9 に答えがあります。
次に、[...] クラスのクラス変数初期化子と静的初期化子を実行します [...] 単一のブロックであるかのように、テキスト順に実行します。
つまり、static {}
静的フィールドのブロックと初期化式は、ソース コードに表示される順序で実行されます。静的ブロックがフィールド宣言の前にある場合は、最初に実行されます (通常、フィールドのデフォルト値が表示されます)。null
または 0)、静的ブロックがフィールド宣言の後にある場合は、2 番目に実行されます (初期化式によって割り当てられた値が表示されます)。
静的クラスと通常のクラスを使用しても、使用できるプログラミング構造には影響しませんが、クラスが周囲のクラスのインスタンス フィールド/メソッドにアクセスできるかどうかを制御するだけです。