子类引用父类对象

4
创建子类引用父类对象有什么用?
class A { /* ... */ }

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

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

4
这段代码总是会抛出异常。你试过吗?你对它有什么不理解的地方吗? - JB Nizet
@JB Nizet.. 如果我没记错的话,他是在询问关于Java概念的问题,而不是与代码相关的问题。 - ngesh
3个回答

3
一个原因是为了在子类中调用出现的方法,而这些方法在超类中不会出现或被覆盖。
例如,
类A(车辆)- 超类
类B(汽车)- 子类
Vehicle有一个名为getTopSpeed()的方法,可以在任何Vehicle上调用。 Car有一个名为getTaxDiscExpiry()的方法,只对汽车有意义,而对于其他车辆如船只则没有意义。

2
你的意思是要创建一个“超类引用指向子类对象”吗?这个问题似乎更有意义(也是代码实际执行的操作),因为你实际上确实会失去一些功能,因为超类中没有可用的方法。
如果是这样,那是因为抽象化 - 如果你有很多汽车,你想让它们“开车”,你只需要把它们当作汽车对待。你不需要找出并向下转换为它们是什么类型的汽车,以便可以使用其他可用的方法(例如某些汽车上可能有“按摩()”)。当然,在这种情况下进行向下转换可以让你获得更多可用于操作的方法,但这只是不必要的复杂性,你不会使用它。
这也是一个常见的超类型 - 如果你要枚举saabs、vauxhalls和fords等列表,你可以将它们全部放在List中,并将它们视为Cars进行枚举。
在顶层,你只需要一个Drivable接口就可以引用所有的汽车。这样你可以将任何驾驶的东西放在上面的列表中 - 不管是汽车还是其他物品 - 你永远不需要知道比你要知道的细节更多,同时扩大了范围,涵盖所有驾驶的东西,而不仅仅是汽车)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接