ホームページ >Java >&#&チュートリアル >Java コンストラクターの最初のステートメントに「this()」または「super()」を指定する必要があるのはなぜですか?
Java では、コンストラクターが this() または super() を呼び出す場合、これらの呼び出しは、コンストラクターの最初のステートメントである必要があります。この要件により、次のことが保証されます。
子クラスで処理が行われる前に、親クラスのコンストラクターが親クラスのインスタンスを初期化する必要があります。これにより、サブクラス コンストラクターで呼び出されるメソッドが、すでに正しく設定されている親クラスに依存できるようになります。
this または super が最初のステートメントである必要がなかった場合の場合、コンストラクターが実行される前に親クラスでメソッドを実行することが可能になります。例:
public class MySubClass extends MyClass { public MySubClass() { someMethodOnSuper(); // ERROR: super not yet constructed super(); // This call would be moved to the beginning of the constructor. } }
親クラスにデフォルト コンストラクターがある場合、コンパイラーは子クラスの最初のステートメントとして super() への呼び出しを自動的に挿入します。コンストラクタ。これが必要なのは、すべての Java クラスが Object を継承し、そのコンストラクターを最初に呼び出す必要があるためです。最初のステートメントの要件を強制すると、一貫したコンストラクターの実行順序が確保されます。
Object -> Parent -> Child -> ChildOfChild -> SoOnSoForth
this() または super() を最初のステートメントとしてのみ呼び出すことを許可することで、コンパイラーは次のような無効なコードを防止します:
public MySubClass extends MyClass { public MySubClass() { int c = a + b; super(); // COMPILE ERROR } }
この例では、super() が最初のステートメントである必要があり、 c の計算をその前に行うことはできません。ただし、この機能はコンストラクターを次のように書き換えることで実現できます。
public MySubClass extends MyClass { public MySubClass() { super(a + b); // OK } }
コンストラクターの最初のステートメントとして this() と super() を配置するという要件により、正しいことが保証されます。実行順序を調整し、メソッドの早すぎる実行を防止し、コンパイラーがデフォルトのコンストラクターを自動的に処理できるようにします。この制限がないと、無効なコードが作成され、信頼性の低い動作や実行時エラーが発生する可能性があります。
以上がJava コンストラクターの最初のステートメントに「this()」または「super()」を指定する必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。