これは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] を実装する Anonymous クラスにはコンストラクターがないことに注意してください。したがって、構築時にあらゆる種類の式を実行するには、インスタンス初期化子が必要です。