Java の継承では、スーパー クラス (親クラス) はオブジェクトの動作とプロパティを定義する一般クラスであり、サブクラス (派生クラス) はスーパー クラスから継承し、機能を拡張します。サブクラスは、スーパークラスの非プライベート メンバーを使用でき、スーパークラスのメソッドをオーバーライドできます。
ポリモーフィズム:
ポリモーフィズムにより、オブジェクトの動作を実際の型に応じて変えることができます。 Java では、サブクラス オブジェクトをスーパークラス オブジェクトに割り当てることができ、スーパークラス メソッドが呼び出されるときに実行される実際のメソッドは、オブジェクトの実際の型に応じて異なります。
ポリモーフィズムの利点:
-
コードの再利用: スーパー クラスは共通の動作を定義でき、複数のサブクラスを再利用できます。
-
拡張性: スーパークラスを変更せずに、新しいサブクラスを簡単に追加できます。
-
疎結合: クライアント コードは、オブジェクトの実際の型を知らなくても、スーパークラスと対話する必要があるだけです。
ポリモーフィズムの課題:
-
型の消去: コンパイル後、サブクラスの型情報が消去され、実行時に異なるサブクラスを区別できなくなります。
-
メソッドの上書き: サブクラスはスーパークラスのメソッドをオーバーライドできます。注意しないと、親クラスの動作を破壊する可能性があります。
-
セキュリティ違反: サブクラス オブジェクトの実際の型がスーパークラス オブジェクトに割り当てられた型と異なる場合、 セキュリティ の問題が発生する可能性があります。
######ベストプラクティス:######
継承関係を明確に定義します。
サブクラスがどのスーパークラスから継承するかを明確に指定します。
-
メソッドをオーバーライドする場合は注意してください: スーパークラス メソッドをオーバーライドした場合の結果を慎重に考慮してください。
-
抽象クラスとインターフェイスを使用する: 抽象クラスとインターフェイスを使用すると、より柔軟で安全な継承を実現できます。
-
単体テストの実行: ポリモーフィックな動作があらゆる状況で適切に動作することを確認します。
-
よくある誤解:
ポリモーフィズムは継承ではありません:
ポリモーフィズムは継承に基づいていますが、継承そのものではありません。
-
サブクラスは常にスーパークラスよりも優れています: サブクラスは必ずしもスーパークラスよりも優れた選択肢であるとは限りません。
-
ポリモーフィズムはすべての問題を解決できます: ポリモーフィズムは強力な
ツール - ですが、ソフトウェア設計の問題をすべて解決できるわけではありません。
######例:######
次の例を考えてみましょう:
クラスの形状 {
protected 文字列名。
public voiddraw() {
System.out.println("図形の描画");
}
}
クラス Rectangle extends Shape {
public voiddraw() {
super.draw();
System.out.println("長方形の描画");
}
}
クラス Circle extends Shape {
public voiddraw() {
super.draw();
System.out.println("円を描く");
}
}
パブリッククラス Main {
public static void main(String[] args) {
形状 s1 = 新しい Rectangle();
形状 s2 = 新しい Circle();
s1.draw(); // 「長方形の描画」を出力します。
s2.draw(); // 「円を描く」を出力します。
}
}
この例では、Shape は、共通の動作とプロパティを定義するスーパークラスです。
Rectangle
と
Circle
は、
Shape
の動作を拡張する Shape から継承されたサブクラスです。 main メソッドは 2 つの Shape オブジェクトを作成し、1 つは Rectangle に割り当てられ、もう 1 つは Circle に割り当てられます。 draw() メソッドが呼び出されると、実行される実際のメソッドはオブジェクトの実際の型に依存し、多態性を示します。
以上がJava 継承の迷路: スーパークラス、サブクラス、ポリモーフィズムのナビゲートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。