Java では、this() と super() という厳密なルールが適用されます。呼び出しはコンストラクター内の最初のステートメントである必要があります。この制限は、子クラスのコンストラクターの実行前に親クラスが適切に初期化されるようにするために存在します。
たとえば、次のコードは、super(c) が MySubClass の最初のステートメントではないため、コンパイル時エラーを引き起こします。 constructor:
public class MySubClass extends MyClass { public MySubClass(int a, int b) { int c = a + b; super(c); // COMPILE ERROR } }
ただし、コードを変更することでこれを回避できます。 to:
public class MySubClass extends MyClass { public MySubClass(int a, int b) { super(a + b); // OK } }
順序が重要な理由
サブクラス コンストラクター内の super() 呼び出しは、親クラスのインスタンス変数を初期化し、親コンストラクターを呼び出します。これにより、サブクラスのコンストラクターが続行する前に、親クラスが完全に初期化されることが保証されます。
super() が最初のステートメントである必要がない場合は、その前に初期化されている親クラスに依存する操作を実行することが可能になります。実際には初期化されており、未定義の動作が発生する可能性があります。
例外と回避策
コンパイラでは this() と super() を最初に呼び出す必要がありますが、コンストラクター内のロジックの実行は制限されません。ロジックは、単一の式に配置することも、super() または this() 呼び出しに渡すこともできます。
例:
public class MySubClass extends MyClass { public MySubClass(int a, int b) { super(Arrays.asList(new Object[] { a, b })); // OK } }
結論
this() と super() はコンストラクター内の最初のステートメントでなければならないという制限は、オブジェクトの適切な初期化を保証し、時期尚早なアクセスによって引き起こされる潜在的なエラーを防ぐために役立ちます。親クラスのメンバーが適切に初期化される前に。これにより、クラスのコンストラクター実行の予測可能な順序が強制され、オブジェクトの整合性と一貫性が確保されます。
以上がJava コンストラクターの最初のステートメントに「this()」と「super()」を指定する必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。