2012-04-16 15 views

答えて

13

SuperClassのインスタンスしか取らないメソッドがあります。​​SuperClassなので、​​のインスタンスを使用して、SuperClassとして扱うことができます。インタフェースでの作業時

同じ動作が使用されます。

多型の美しさだ
List someList = new ArrayList(); 

。それはあなたのコードの残りの部分を壊すことなく、クラスの内部の実装を変更することができます。

+4

ここで重要なのは、 'SubClass' *は' SuperClass'です。 –

+0

この動作はJava 8で変更されましたか?メソッドがスーパークラスのパラメータ 'void method(SuperClass param)'を取る場合をテストしましたが、メソッドのようにサブクラスインスタンス 'SubClass sub = new SubClass();'を呼び出すことができます(サブ); '。つまり、上向きの互換性が現在許可されていますか? –

1

あなたがしていることは、コンパイル時に参照のタイプが何であるかをJVMに伝えるだけです。

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

4

これを行う主な理由は、スーパークラスを必要とする関数呼び出しのためです。あなたはこの

public static void insert(SuperClass b) { 
    //do something 
} 

のようなメソッドを持つクラスAを持っているとあなたが

A.insert(object); 

を行うことができますしかし、あなたは

SubClass object new SubClass(); 
をすれば

SuperClass object = new SubClass(); 

を持っている場合

できません

A.insert(object); 

あなたはこれを使用すると、冗長またはコピーしたコードを削減し、きれいなものを保持するのに役立ちます

public static void insert(SubClass b) { 
    //do something 
} 

に、このようなメソッドを追加しない限り。

12

これは、多型性として知られています。 は、次の例を想像してみて:play()

Musician musician = new Pianist(); 

または

Musician musician = new Drummer(); 

Musicianクラスはメソッドを持っていると仮定します。あなたが演奏方法を呼んでも、ミュージシャンが誰であるかは関係ありません。ピアニストかドラマーかにかかわらず、決定された楽器をどのように演奏するかは、この場合、具体的なクラスに基づいています。

各具象クラス、そのplay()メソッドを上書きし、自分でプレイすることができます:

例えばPianistクラス:詳細についてはplay() { playsBeethoven(); }

、それはあなたが継承を使用主な理由の一つであり、継承http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

0

でそれを使用することを忘れないように、常に良いことだhttp://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

を確認してください。 SuperClassを抽象として扱い、コンパイル時に派生型を知る必要はなく、別のクラスで派生型を知る必要はありません。これにより、多型を使用して派生クラスのメソッドを呼び出す際に、SuperClassへの参照を使用できます。

これは、あなたは

することができます。)あなたはコンパイル時にタイプを知っている必要はありません、とあなたは派生型を作成し、いくつかのランタイムメソッドを持つように工場を作成します。 COM、GStreamer、DirectShow、Glibなどを考えてください。

b。)派生型のインスタンスでも、基本型参照を公開するだけで他のオブジェクトの複雑さを隠すことができます。オブジェクトを返すメソッドやオブジェクト参照を引数として考える方法について考えてみましょう。

c。)もっと多くの可能性がありますが、おそらく最も関連性の高い2つの用途です。

関連する問題