我想知道为子类创建对象但是分配A类ref而不是分配B类ref的优势。它显示在代码
下面的第1行第2行 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);
}
}
答案 0 :(得分:1)
如果您不需要任何特定于B
的方法,换句话说,您将严格地将其用作A
,那么可读性就是一个优势。
但是,当您在方法声明中使用常规类型时,主要优势就会浮出水面:
public String resolveName(A a) { ... }
如果你没有充分的理由在这里使用B
,那么你会不必要地削弱你的方法。它可以适用于任何A
,但它仅适用于B
。
答案 1 :(得分:0)
尝试阅读:Polymorphism
答案 2 :(得分:0)
在你的简短例子中,没有真正的优势。 但总的来说,你的问题是多态性有什么用?
答案可以追溯到OOP方法的必要性。 简而言之,它使您能够从使用中封装和抽象实现,并且可以帮助您将来替换实现而无需更改用法。
有关详细信息,请参阅http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
答案 3 :(得分:0)
在那个例子中,我认为你不能谈论优势(或劣势),因为你的两行代码各自做了一些非常不同的事情。
如果变量a
的类型为A
,则a.b
会引用值为b
的字段10
。
但是,如果您将a
的类型更改为B
,那么a.b
会引用一个完全不同的字段,即在B
内声明的字段,其值为{{1} }}
如果12
是一个方法,那么在b
中声明的方法将“覆盖”在B
中声明的方法,这是一种非常不同的情况。 e.g。
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
。 / p>
这样做的好处是你可以拥有一系列物品(例如各种车辆),它们可以是汽车,船只,火车等的混合体。每种都有自己的12
方法实现,所以你可以用同样的方式对待它们。
虽然通常在start
而不是interface
中定义此类方法更为明确。 class
车辆没有通用的方法,所以没有理由让基类具有无意义的start
实现。相反,你只需使用一个接口来声明方法的“形状”而不给它任何实现。