質問の背景:
ポリモーフィズムはオブジェクト指向プログラミング(OOP)の重要な原則の一つであり、Javaの誕生以来サポートされています。これは、プログラムの実行中にオブジェクトの実際の型に応じて異なる動作をさせることを可能にします。基本型の参照を使用してもです。
問題:
ポリモーフィズムがないと、コードは硬直化し、異なるタイプのオブジェクトを扱うためにswitch-caseやif-elseの冗長な構造がよく現れます。これにより、コードの保守と拡張が難しくなります。ポリモーフィズムは異なるタイプのために繰り返しコードを書く必要性の問題を解決します。
解決策:
Javaにおけるポリモーフィズムは、継承とインターフェースを通じて実装されています。これにより、次のことが可能になります:
コードの例:
class Animal { void speak() { System.out.println("Animal speaks"); } } class Dog extends Animal { @Override void speak() { System.out.println("Dog barks"); } } class Cat extends Animal { @Override void speak() { System.out.println("Cat meows"); } } public class PolyDemo { public static void main(String[] args) { Animal a1 = new Dog(); Animal a2 = new Cat(); a1.speak(); // Dog barks a2.speak(); // Cat meows } }
主な特徴:
ポリモーフィズムにおけるメソッドのオーバーロード(overloading)とオーバーライド(overriding)の違いは何ですか?
オーバーロードは、同じ名前の複数のメソッドを異なるシグネチャで同じクラスに定義することです。オーバーライドは、親クラスと同じシグネチャのメソッドをサブクラスで定義することです。
class Example { void foo(int x) {} void foo(String y) {} // これはオーバーロード } class Base { void foo() {} } class Child extends Base { @Override void foo() {} // これはオーバーライド }
継承なしにポリモーフィズムは可能ですか?
従来の理解では、Javaでは不可能です:ポリモーフィズムは継承階層や実装されたインターフェースの存在を必要とします。
親クラスの参照からサブクラスのメソッドを呼び出すことはできますか?
親クラスで定義されているか、サブクラスでオーバーライドされたメソッドのみを呼び出すことができます。サブクラスにのみ存在するメソッドは型キャストなしでは呼び出すことができません。
Animal a = new Dog(); a.speak(); // 可能 // a.fetch(); // コンパイルエラー、Dogがfetch()メソッドを持っていても
プロジェクトでDog、Cat、Cowクラスが実装されていますが、使用されているコードは型に直接依存し、明示的なキャストやinstanceofを使用してメソッドを呼び出していました。
プラス面:
マイナス面:
Animalを継承して仮想的なspeak()を持つ。すべてのやり取りは基本型Animalを通じて行われます。
プラス面:
マイナス面: