この記事では、まずインスタンス変数初期化子、インスタンス初期化子、静的初期化子とは何かを説明する例を示します。次に、インスタンス初期化子がどのように動作するかを見てみましょう。
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(); } }
出力は次のとおりです:
static initializer called instance initializer called constructor called instance initializer called constructor called
2. Java のインスタンス初期化子はどのように機能しますか?
上記の例のインスタンス初期化子には、文字を出力するコードが含まれています。仕組みを理解するには、変数の代入のプロセスをイメージすると理解するのは難しくありません。
次のように値を割り当てることに加えて:
int b = 0;
、次のように書くこともできます:
int b; b = 0;
したがって、インスタンス初期化子とインスタンス変数初期化子は非常に似ています。
3. インスタンス初期化子はいつ使用されますか?
強度初期化子が使用できる機会は比較的少ないです。ただし、場合によっては、インスタンス変数初期化子の代わりに、次のような代替手段が存在することがあります。
初期化コードは例外を処理する必要がある
インスタンス変数では実行できない計算を実行する
もちろん、これらは要件は依然としてコンストラクターで実装できます。ただし、クラスに複数のコンストラクターがある場合は、各コンストラクターで同じコードを繰り返す必要があります。
インスタンス初期化子に書かれたコードは、どのコンストラクターを使用しても、インスタンス初期化子内のコードが実行されます (もっと言うかもしれませんが、あまり使われないかもしれません)。
インスタンス初期化子のもう 1 つのアプリケーション シナリオは、匿名の内部クラスです。この場合、コンストラクターをまったく作成できないためです。 (これはログ コードを配置するのに適した場所かもしれません。)
上記は Java のインスタンス初期化子の内容に関するもので、さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。