SuperClass object = new SubClass();
上記のようにスーパークラスを使用してサブクラス オブジェクトをインスタンス化するのはなぜですか? オブジェクトをインスタンス化することを学んだ唯一の方法は次のとおりです。
SubClass object = new SubClass();
私はJavaを学んでいます。
SuperClass object = new SubClass();
上記のようにスーパークラスを使用してサブクラス オブジェクトをインスタンス化するのはなぜですか? オブジェクトをインスタンス化することを学んだ唯一の方法は次のとおりです。
SubClass object = new SubClass();
私はJavaを学んでいます。
これはポリモーフィズムとして知られています。次の例を想像してみてください。
Musician musician = new Pianist();
また
Musician musician = new Drummer();
クラスMusician
にメソッドがあるとしますplay()
。ミュージシャンが誰であるかは関係ありません。playメソッドを呼び出すと、ピアニストかドラマーかに関係なく、具体的なクラスに基づいて、決定された楽器を演奏する方法がわかります。
各具象クラスは、そのplay()
メソッドを上書きして、自分で再生できます。
例Pianist
:クラスの場合:play() { playsBeethoven(); }
詳細については、http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.htmlを確認してください。
継承と一緒に使用することを忘れないでくださいhttp://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
のインスタンスのみを取得するメソッドがある場合がありますSuperClass
。SubClass
はである ためSuperClass
、のインスタンスを使用しSubClass
て、として扱うことができますSuperClass
。
インターフェイスを操作するときも同じ動作が使用されます。
List someList = new ArrayList();
それがポリモーフィズムの美しさです。これにより、残りのコードを壊すことなく、クラスの内部の実装を変更できます。
前者を行う主な理由は、スーパークラスを期待する関数呼び出しのためです。A
このようなメソッドを持つクラスがある場合
public static void insert(SuperClass b) {
//do something
}
そしてあなたは
SuperClass object = new SubClass();
できるよ
A.insert(object);
しかし、あなたがそうするなら
SubClass object new SubClass();
あなたはできません
A.insert(object);
このようなメソッドをAに追加しない限り
public static void insert(SubClass b) {
//do something
}
これにより、冗長なコードやコピーされたコードを削減し、物事をよりクリーンに保つことができます。
コンパイル時に参照の型を JVM に伝えるだけです。
最初のケースでは、オブジェクト参照にスーパー クラスの静的な型があると言っています。新しいサブクラス オブジェクトを作成する場合、サブクラスはスーパー クラス インスタンスであるため、その参照ポイントをそのオブジェクトに向けることができます。
これが、継承を使用する主な理由の 1 つです。SuperClass を抽象化として扱い、コンパイル時に派生型を知る必要がなく、別のクラスが派生型を知る必要もありません。これにより、ポリモーフィズムを使用して派生クラスのメソッドを呼び出しながら、SuperClass への参照を使用できます。
これにより、次のことが可能になります。
a.) コンパイル時に型を知る必要がないようにファクトリを作成し、派生型を作成するランタイム メソッドをいくつか用意します。COM、GStreamer、DirectShow、Glib などを考えてみてください。
b.) 派生型のインスタンスであっても、基本型の参照のみを公開することで、複雑さを他のオブジェクトに隠します。オブジェクトを返すメソッド、またはオブジェクト参照を引数として受け取るメソッドについて考えてみてください。
c.) 他にも多くの可能性がありますが、これらはおそらく最も関連性の高い 2 つの用途です。