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