クラスのインスタンスを作成するとき、コンストラクターは最初にそのスーパー クラス コンストラクターを呼び出して、スーパー クラス フィールドを初期化します。すべてのスーパー クラス コンストラクターが実行されると、現在のコンストラクターのみが独自のフィールドの初期化を続行します。
これで、コンストラクターに呼び出しを追加してthis()
も、スーパー クラス コンストラクターは呼び出されません。これは、コンストラクターの最初のステートメントがスーパークラス コンストラクターへのチェーン - using super()
、または同じクラスの別のコンストラクター- using であるためthis()
です。
this()
そのため、フィールドはまだ初期化されていないため、でフィールドを渡すことはできません。しかし、それは本当に意味がありません、なぜあなたはそのようなことをしようとしていますか?
コンパイラは、クラスの各コンストラクター内にフィールド初期化コードを移動することに注意してください。したがって、コンストラクターは実質的に次のものと同等です。
Con() {
this(++x); //1
// This is where initialization is done. You can't access x before it.
x = 10;
System.out.println("x :"+x);
}
これはsuper()
呼び出しでも同様です。したがって、以下のコードでも同じエラーが発生します (Con
パラメーター化されたコンストラクターで別のクラスを拡張することを検討してください)。
Con() {
super(++x); //1
System.out.println("x :"+x);
}