21
SuperClass object = new SubClass();

上記のようにスーパークラスを使用してサブクラス オブジェクトをインスタンス化するのはなぜですか? オブジェクトをインスタンス化することを学んだ唯一の方法は次のとおりです。

SubClass object = new SubClass();

私はJavaを学んでいます。

4

5 に答える 5

15

これはポリモーフィズムとして知られています。次の例を想像してみてください。

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

于 2012-04-16T16:00:48.157 に答える
15

のインスタンスのみを取得するメソッドがある場合がありますSuperClassSubClass はである ためSuperClass、のインスタンスを使用しSubClassて、として扱うことができますSuperClass

インターフェイスを操作するときも同じ動作が使用されます。

List someList = new ArrayList();

それがポリモーフィズムの美しさです。これにより、残りのコードを壊すことなく、クラスの内部の実装を変更できます。

于 2012-04-16T15:57:32.850 に答える
9

前者を行う主な理由は、スーパークラスを期待する関数呼び出しのためです。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
}

これにより、冗長なコードやコピーされたコードを削減し、物事をよりクリーンに保つことができます。

于 2012-04-16T15:59:52.043 に答える
1

コンパイル時に参照の型を JVM に伝えるだけです。

最初のケースでは、オブジェクト参照にスーパー クラスの静的な型があると言っています。新しいサブクラス オブジェクトを作成する場合、サブクラスはスーパー クラス インスタンスであるため、その参照ポイントをそのオブジェクトに向けることができます。

于 2012-04-16T15:58:55.773 に答える
1

これが、継承を使用する主な理由の 1 つです。SuperClass を抽象化として扱い、コンパイル時に派生型を知る必要がなく、別のクラスが派生型を知る必要もありません。これにより、ポリモーフィズムを使用して派生クラスのメソッドを呼び出しながら、SuperClass への参照を使用できます。

これにより、次のことが可能になります。

a.) コンパイル時に型を知る必要がないようにファクトリを作成し、派生型を作成するランタイム メソッドをいくつか用意します。COM、GStreamer、DirectShow、Glib などを考えてみてください。

b.) 派生型のインスタンスであっても、基本型の参照のみを公開することで、複雑さを他のオブジェクトに隠します。オブジェクトを返すメソッド、またはオブジェクト参照を引数として受け取るメソッドについて考えてみてください。

c.) 他にも多くの可能性がありますが、これらはおそらく最も関連性の高い 2 つの用途です。

于 2012-04-16T16:02:34.057 に答える