2016-10-27 6 views
1

ここに私はこの質問があります。例えば、コード1がJavaで実行時多型がであり、コード2がであり、実行時多型なしのJavaであるとします。オブジェクトの作成時に宣言された基本クラス/インタフェースまたは実装ですか?

コード1:

class A { 
    void run() { System.out.println("A is running"); } 
} 

class B extends A{ 
    void run(){ System.out.println("B is running with A!");} 

    public static void main(String args[]){ 

     A a = new B(); //referenced to class A 
     a.run(); 

    } 
} 

コード2:

class A { 
    void run(){System.out.println("A is running");} 
} 

class B extends A{ 
    void run(){ System.out.println("B is running with A!");} 

    public static void main(String args[]){ 
     B a = new B(); //referenced to the same constructor class 
     a.run(); 
    } 
} 

これら2つのコードはまったく同じ結果が得られたとしても、うまく実行時の多型がOOPで本当に重要であることが知られています。 Iコード1を使用する代わりに、さんはこのケースを見てみましょうコード2.

+0

ランタイムポリモーフィズムは、複数の異なるオブジェクトが同じクラスから継承し、それらを単一の配列に格納する必要がある場合に非常に役に立ちます – Treycos

+1

この例ではランタイムポリモーフィズムの使用が動機付けられていません。 –

+0

可能な複製http://stackoverflow.com/questions/20783266/what-is-the-difference-between-dynamic-and-static-polymorphism-in-java – Nurjan

答えて

1

はポリモーフィズムを活用して、すべてのケースではOOPでは必要ありません。
多型は、柔軟性が必要な場合に柔軟性をもたらすメカニズムです。例えば

、あなたのケースでは、書き込み:あなたは、変数の宣言型として、サブクラスではなく、基本クラスを参照する必要があり、興味を持っている場合

B a = new B(); 

または

A a = new B() 

は異なり。基本クラスを参照

は(ここではA)(それが網羅が、頻繁に使用するケースではありません)これらの中で多くのことを可能にする:

  • 実装をマスキング(工場又は注射依存経由)。このようにして、クライアントコードの呼び出しを中断することなく、実装を変更することができます(Aを拡張するCまたはDを返します)。あなたのコードでは、それを実行しませんが、実際のアプリケーションでは、この必要性を持つことができます。
  • ABクラスに共通の処理をお持ちの場合は、Aという型のインスタンスをパラメータとするメソッドを提案することができます。もしB a = new B()を宣言するかどうか、などの意味的にその方法には、このインスタンスを渡す場合 例この場合: public void doProcess(A instance)
    は、コードは、 をコンパイルしないであろうBインスタンスはAあるがAインスタンスは、必ずしもB
ありません

多くの場合、インプリメンテーションが良い方法ではなく、インターフェイスを宣言することができます。実際、それはほとんどの場合ですが、他の場合にはそうではありません。たとえば、TreeMapを使用する必要がある場合は、TreeMapの動作が非常に特殊で特別な要件があるため、インターフェイスにMapを宣言することはありません。古典的なHashMapをインスタンス化するときは、一般的にはインターフェイスが十分であるため、宣言された型としてHashMapをpreciseすることは気にしません。実装との強力な結合を作成することに興味はありません。

+0

これは多くの助けになります!ありがとう –

+0

あなたは大歓迎です:)多形性がOOP言語の鍵の1つであるので、あなたは主題について疑問に思うでしょう:) 私はあなたの質問に答えた場合、私の答えを受け入れるように自由にマークしてください。 – davidxxx

1

を使用しての説明/理由が必要です。
あなたは同じ基本クラスから継承する複数のクラスを持っているし、あなたがそれらのすべての彼らの共有機能run()を呼びたいですたとえクラスが異なっていても同じです。
あなたはこれを行う必要があるでしょう:

interface A{ 
    void run(); 
} 

class B implements A{ 
void run(){ System.out.println("B is running with A!");} 

class C implements A{ 
void run(){ System.out.println("C is running with A!");} 

public static void main(String args[]){ 
    Array<A> objects = new Array<A>(); 
    objects.put(new B()); //Object are stored as instances of "A" 
    objects.put(new C()); 
    objects.put(new B()); 
    for (A obj : objects) 
     obj.run();//Calls everything 
} 
関連する問題