その例では、2行のコードがそれぞれ非常に異なることを行うため、長所(または短所)について話すことはできないと思います。
変数のタイプが、の場合a
、A
値が。a.b
のフィールドを参照します。b
10
ただし、のタイプを変更するa
と、値がで、内部で宣言されたまったく異なるフィールドを参照しB
ます。a.b
B
12
代わり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
。代わりに、インターフェースを使用して、実装を行わずにメソッドの「形状」を宣言します。