0

サブクラスのオブジェクトを作成するが、クラスB参照を割り当てる代わりに、クラスA参照を割り当てることの利点について知りたい。これは、コードの下のline1、line2に示されています

 class A
    {
         int b=10;
     }
    class B extends A
    { 
         int b=12;

        }
    class Test
    {
         public static void main(String[] args)
         {
               A a=new B(); //line1 
               //B a=new B();//line2
            System.our.println(a.b);
         }
    }
4

4 に答える 4

1

に固有のメソッドを必要としない場合B、つまり、厳密に として使用する場合はA、そのように述べると読みやすさが向上します。

しかし、メソッド宣言で一般型を使用すると、主な利点が明らかになります。

public String resolveName(A a) { ... }

B正当な理由もなくここで使用すると、メソッドが不必要に機能しなくなります。任意の に対して機能する可能性がありますがA、 に対してのみ機能しBます。

于 2012-05-11T07:52:51.230 に答える
0

その例では、2行のコードがそれぞれ非常に異なることを行うため、長所(または短所)について話すことはできないと思います。

変数のタイプが、の場合aA値が。a.bのフィールドを参照します。b10

ただし、のタイプを変更するaと、値がで、内部で宣言されたまったく異なるフィールドを参照しBます。a.bB12

代わりbにメソッドである場合、で宣言されたものはで宣言されたBものを「オーバーライド」しますA。これは非常に異なる状況です。例えば

class A
{
     public int b() { return 10; };
}
class B extends A
{ 
     public int b() { return 12; }
}

そして、呼び出しコードは次のようになります。

A a=new B(); //line1 
//B a=new B();//line2
System.our.println(a.b());

つまり、メソッドを呼び出してb戻り値を取得します。aこれで、のタイプがであるAか。であるかにかかわらず、動作に違いはありませんB。重要なのは、参照するオブジェクトのタイプですa。これは、常にB、したがって常にで定義された動作を持っているBため、12関係なく出力されます。

これの利点は、オブジェクト(たとえば、さまざまな種類の車両)のコレクションを作成でき、それらを車、ボート、電車などの混合物にすることができることです。それぞれにstartメソッドの独自の実装があるため、それらすべてを処理できます。同じ方法。

interface一般に、そのようなメソッドを。ではなく、で定義する方が明確classです。車両への一般的な方法はないstartので、意味のない実装を持つ基本クラスを持つ理由はありませんstart。代わりに、インターフェースを使用して、実装を行わずにメソッドの「形状」を宣言します。

于 2012-05-11T07:56:22.740 に答える
0

これを読んでみてください:ポリモーフィズム

于 2012-05-11T07:49:32.337 に答える
0

あなたの短い例では、本当の利点はありません。しかし、一般的にあなたの質問は、ポリモーフィズムが何に適しているかについてですか?

その答えは、OOP 方法論の必要性にまでさかのぼります。要するに、使用法から実装をカプセル化して抽象化する機能を提供し、使用法を変更する必要なしに将来実装を置き換えるのに役立ちます。

詳細については、http://en.wikipedia.org/wiki/Polymorphism_ (computer_science )を参照してください。

于 2012-05-11T07:50:28.190 に答える