私はまだJavaの学習曲線にあります。私は小さなテストクラスを作成した初期化子ブロックのビットより多くを理解するために:非静的イニシャライザブロック - もう少し制御できますか?
public class Script {
{
Gadgets.log("anonymous 1");
}
public Script() {
Gadgets.log("constructor");
}
{
Gadgets.log("anonymous 2");
}
}
私はインスタンスを作成するときに、私はこのログを取得:
Script: anonymous 1
Script: anonymous 2
Script: constructor
これは私に語った、両方の初期化ブロックは、前に実行しますコンストラクタをソースコード内に現れる順に実行します(静的初期化子と同じ)。 私が知りたいことは次のとおりです。この行動に対してもう少しコントロールできますか? (source)Javaドキュメントが言うので:インスタンスの変数は静的な 初期化子ブロックのように見えますが、静的なキーワードのない
初期化子ブロック:
{
// whatever code is needed for initialization goes here
}
のJavaコンパイラのコピーの初期化子をすべてのコンストラクタにブロックします。したがって、 このアプローチは、複数の コンストラクタ間でコードブロックを共有するために使用できます。
したがって、「初期化ブロックをすべてのコンストラクタにコピーする」という意味はどういう意味ですか?私のログによると、彼らは各コンストラクタの最初にのとコピーされているようです。これは正しいですか?彼らはそれぞれのコンストラクタのENDにコピーされた場合も、完全に理にかなって複数のコンストラクタとの間のこのようなブロックを共有
(それは私が期待して何が私の2匿名)。 は、もう少しそれらのブロックを制御する方法はありますか私の唯一のオプションは、私は、各コンストラクタの最後で一般的なタスクを実行したい場合は、すべてのコンストラクタで呼び出されるという名前のメソッドを書くの「古典的」な方法ですか?
コンストラクタの前にコピーされるコードの問題は何ですか? –
コンストラクタは、コンストラクタのコードより前に実行する必要があり、最後には必要ではないことが予想されます。コンストラクタが既に初期化されている変数に依存することができるからです。 – mah
実際、*初期化ブロック*はコンストラクタに**コピー**され、 'super'の後で残りのコンストラクタボディの前に実行されます。 –