ホームページ > Java > &#&チュートリアル > Java コンストラクターの最初のステートメントに「this()」と「super()」を指定する必要があるのはなぜですか?

Java コンストラクターの最初のステートメントに「this()」と「super()」を指定する必要があるのはなぜですか?

Patricia Arquette
リリース: 2024-12-19 14:17:09
オリジナル
941 人が閲覧しました

Why Must `this()` and `super()` Be the First Statements in a Java Constructor?

コンストラクター内の他のすべてのステートメントの前に this() と super() を呼び出す必要があるのはなぜですか?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート