ホームページ >Java >&#&チュートリアル >Java コンストラクターの最初のステートメントに「this()」と「super()」を指定する必要があるのはなぜですか?
コンストラクターの実行順序の強制: this() と super() が最初のステートメントである必要がある理由
Java は if this() を厳密に強制しますまたは super() がコンストラクター内で呼び出される場合、それらは最初のステートメントである必要があります。この制限により、親クラスと子クラスのコンストラクターの初期化シーケンスが正しい順序で行われるようになります。
次の例を考えてみましょう。
public class MyClass { public MyClass(int x) {} } public class MySubClass extends MyClass { public MySubClass(int a, int b) { super(c); // Compile error int c = a + b; } }
MySubClass コンストラクターでの super(c) の呼び出しこれは最初のステートメントではないため、コンパイル時エラーが発生します。コンパイラでは、親クラスのコンストラクターが最初に呼び出され、サブクラスのコンストラクターが実行される前に親クラスの状態が初期化される必要があります。
このエラーを解決する 1 つの方法は、コードを再配置することです。
public class MySubClass extends MyClass { public MySubClass(int a, int b) { super(a + b); // OK } }
ここでは、c の計算は super() の引数内で実行され、親クラスのコンストラクターを呼び出すことができます。
別の例は、制限によってどのように誤ったコードの実行が防止されるかを示しています。
public class MyClass { public MyClass(List list) {} } public class MySubClassA extends MyClass { public MySubClassA(Object item) { List list = new ArrayList(); list.add(item); super(list); // Compile error } }
コードはリストを作成して親クラスのコンストラクターに渡そうとしますが、これは許可されていません。この制限が適用されていない場合、初期化前に親クラスのメソッドを呼び出すときにコードがエラーで失敗する可能性があります。
this() と super() を最初のステートメントに強制することで、コンストラクターが確実に呼び出しシーケンスは正しく、Java の親クラスと子クラスの適切な初期化が保証されています。
以上がJava コンストラクターの最初のステートメントに「this()」と「super()」を指定する必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。