これはhttp://www.programcreek.com/2011/10/java-class-instance-initializers/から直接です。
1.実行順序
次のクラスを見て、どれが最初に実行されるか知っていますか?
public class Foo {
//instance variable initializer
String s = "abc";
//constructor
public Foo() {
System.out.println("constructor called");
}
//static initializer
static {
System.out.println("static initializer called");
}
//instance initializer
{
System.out.println("instance initializer called");
}
public static void main(String[] args) {
new Foo();
new Foo();
}
}
出力:
静的初期化子が呼び出されました
呼び出されたインスタンス初期化子
呼び出されたコンストラクタ
呼び出されたインスタンス初期化子
呼び出されたコンストラクタ
2. Javaインスタンス初期化子はどのように機能しますか?
上記のインスタンス初期化子には、printlnステートメントが含まれています。それがどのように機能するかを理解するために、それを変数割り当てステートメントとして扱うことができますb = 0
。これにより、理解しやすくなります。
の代わりに
int b = 0
、あなたは書くことができます
int b;
b = 0;
したがって、インスタンス初期化子とインスタンス変数初期化子はほとんど同じです。
3.インスタンス初期化子はいつ役立ちますか?
インスタンス初期化子を使用することはまれですが、次の場合はインスタンス変数初期化子の代わりに使用できます。
- 初期化コードは例外を処理する必要があります
- インスタンス変数初期化子では表現できない計算を実行します。
もちろん、そのようなコードはコンストラクターで作成できます。ただし、クラスに複数のコンストラクターがある場合は、各コンストラクターでコードを繰り返す必要があります。
インスタンス初期化子を使用すると、コードを1回記述するだけで、オブジェクトの作成にどのコンストラクターを使用しても実行されます。(これは単なる概念であり、あまり使用されていません。)
インスタンス初期化子が役立つもう1つのケースは、コンストラクターをまったく宣言できない匿名内部クラスです。(これはロギング機能を配置するのに良い場所でしょうか?)
ダーラインに感謝します。
また、インターフェイス[1]を実装する匿名クラスにはコンストラクタがないことに注意してください。したがって、インスタンスの初期化子は、構築時にあらゆる種類の式を実行するために必要です。
public static void staticMethod(){}
、あなたが実行している場合、TestStatic.class.getMethod("staticMethod");
。静的初期化子は呼び出されません。詳細情報はこちらdocs.oracle.com/javase/specs/jvms/se10/html/...