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

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

Mary-Kate Olsen
リリース: 2024-12-29 11:31:16
オリジナル
1011 人が閲覧しました

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

コンストラクターの実行順序の強制: 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 サイトの他の関連記事を参照してください。

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