「Javaチュートリアル-フィールドの初期化」に、インスタンス初期化ブロック(インスタンス初期化子)についての説明があります。
Javaコンパイラは、初期化ブロックをすべてのコンストラクタにコピーします。したがって、このアプローチを使用して、複数のコンストラクター間でコードのブロックを共有できます。
言い換えが正しければ、次のコードについて:</ p>
public class ConstructorTest {
public static void main(String[] args) {
Child c = new Child();
}
}
class Parent {
Parent() {
System.out.println("Parent non-argument Constructor");
}
}
class Child extends Parent {
{
System.out.println("Child Instance Initialization Block");
}
Child() {
this(2);
System.out.println("Child no-argument Constructor");
}
Child(int i) {
this(10, i);
System.out.println("Child 1-argument Constructor");
}
Child(int i, int j) {
System.out.println("Child 2-argument Constructor");
}
}
出力は次のようになります:</ p>
Parent non-parm Constructor
Child Instance Initialization Block
Child 2-argument Constructor
Child Instance Initialization Block
Child 1-argument Constructor
Child Instance Initialization Block
Child no-argument Constructor
しかし、実際の出力は次のとおりです:</ p>
Parent non-argument Constructor
Child Instance Initialization Block
Child 2-argument Constructor
Child 1-argument Constructor
Child no-argument Constructor
その文の意味を誤解したか、説明が十分に正確ではありませんか?</ p>
そして、明示的なコンストラクターの呼び出しに関するもう1つの疑問:
2つの基本に基づく:</ p>
- 存在する場合、別のコンストラクターの呼び出しは、コンストラクターの最初の行である必要があります。
- コンストラクター内から、this()を使用して別のコンストラクターを呼び出し、super()を使用して直接スーパークラスの対応するコンストラクターを呼び出します。
MEANSがサブクラスのコンストラクター内でthis()を使用すると、スーパークラスの引数なしのコンストラクターへのデフォルトの呼び出しが暗黙的に削除されますか?
返信いただきありがとうございます。