子类引用超类对象

时间:2011-08-11 10:05:24

标签: java polymorphism

创建超类对象的子类引用有什么用途

class A { /* ... */ }

class B extends A { /* ... */ }

public class Sample {
    public static void main(String a[]){
        A a = new B();
    }
}

3 个答案:

答案 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())
}
}