ホームページ >Java >&#&チュートリアル >Java では「super.super.method();」が無効なのはなぜですか?

Java では「super.super.method();」が無効なのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-26 00:55:09355ブラウズ

Why Is `super.super.method();` Invalid in Java?

「super.super.method();」の構文がなぜそうなるのかJava では無効です

Java 言語では、「super.super.method();」の構文が許可されていません。

カプセル化の制約

オブジェクト指向プログラミングの基本原理であるカプセル化は、アクセスを制限することを目的としています。オブジェクトの内部状態と動作に影響します。 Java では、これはアクセス修飾子 (private、protected、public など) と継承によって実現されます。

サブクラスがスーパークラス内のメソッドをオーバーライドすると、そのサブクラスは事実上、サブクラス内でそのメソッドを実装する唯一のプロバイダーになります。 。これにより、サブクラス内のメソッドへの変更がスーパークラスや他のサブクラスでの動作に影響を与えないことが保証されます。

カプセル化違反

「super.super」を許可する。方法();"このカプセル化原則に違反します。次の継承階層を考えてみましょう。

class Animal {
    void eat() { System.out.println("Animal eats"); }
}

class Cat extends Animal {
    @Override
    void eat() {
        if (!isFeline()) throw new IllegalArgumentException();
        super.eat();
    }
}

class Lion extends Cat {
    // This "super.super.eat()" would allow bypassing Cat's validation and break encapsulation.
    @Override
    void eat() { super.super.eat(); }
}

この例では、Cat クラスは、動物が食べるにはネコ科動物でなければならないという検証ルールを強制します。 super.super.eat() が許可されている場合、Lion クラスは、Animal クラスから Eat() メソッドを直接呼び出して、Cat のオーバーライド実装によって課されたカプセル化を破ることによって、この検証をバイパスできます。

代替案「super.super.method();」中に

にアプローチします。 Java では許可されていません。特定の望ましい動作を実現するための代替アプローチがあります:

  • メソッド委任: サブクラスが親クラスの動作をオーバーライドせずに再現したい場合は、呼び出しを親のメソッドに委任できます: super.method(args);
  • Typeキャスト: 場合によっては、上位レベルのスーパークラスからメソッドにアクセスするために、明示的な型キャストが必要になることがあります: ((ParentClassType) this).method(args);
  • 新しいメソッドの紹介メソッド: サブクラスの望ましい動作が親クラスとその直接のスーパークラスの両方と大きく異なる場合は、メソッドに新しいメソッドを導入することを検討してください。サブクラス。

以上がJava では「super.super.method();」が無効なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。