创建超类对象的子类引用有什么用途
class A { /* ... */ }
class B extends A { /* ... */ }
public class Sample {
public static void main(String a[]){
A a = new B();
}
}
答案 0 :(得分:3)
一个原因是你可以调用子类中出现的方法,这些方法没有出现在/覆盖超类的方法中。
e.g。
Class A (Vehicle)
〜超类
Class B (Car)
〜subclass
Vehicle有一个名为getTopSpeed()
的方法,可以在任何车辆上调用。
汽车有一种名为getTaxDiscExpiry()
的方法,它只适用于汽车而不适用于其他车辆,例如船只。
答案 1 :(得分:2)
你的意思是创建一个“子类对象的超类引用?”这个问题似乎更有意义(并且是代码正在做的事情),因为你实际上(或可能会)因为超类中没有的方法而失去一些功能。
如果是这样,那是因为抽象 - 如果你有很多车,而你想要它们drive()
,你只需要将它们视为汽车。您不需要查找和预测他们的汽车类型,因此您可以使用其他方法(例如,在某些汽车上可能massage()
。)当然,在这种情况下,向下投射将为您提供更多方法玩,但这只是你不会使用的不必要的复杂性。
它也是一种常见的超类型 - 如果你在一个saabs,vauxhalls和fords列表上进行迭代,你可以将它们全部放在List<Car>
中并以Cars
的形式迭代它们。
在顶级,你可以拥有一个Drivable
界面并引用所有车辆。这样你就可以在上面的列表示例中得到任何驱动 - 无论是否开车 - 你永远不需要知道任何更多的细节,也不需要扩大范围到驱动的所有东西,而不仅仅是汽车。)
答案 2 :(得分:0)
它在您拥有的代码中没有用处。
会有情况许多类正在扩展单个类
和一个方法,其他类在那时被这两个类调用
它的争论类型应该是其面向对象编程的超类类型才能派上用场......
用一个词表示PolyMorphism
的全部...假设条件如下
Class A
{
void f1(Super s){
}
}
class B extends Super
{
void f2(){
new A().f1(new B())
}
}
class A extends Super
{
void f2(){
new A().f1(new A())
}
}