21
SuperClass object = new SubClass();

为什么要使用超类来实例化上面的子类对象?因为我学会实例化对象的唯一方法是:

SubClass object = new SubClass();

我正在学习java。

4

5 回答 5

15

您可能有一个只接受SuperClass. 由于SubClass is a SuperClass,您可以使用 的实例SubClass并将其视为SuperClass

使用接口时使用相同的行为:

List someList = new ArrayList();

这就是多态的美妙之处。它允许您在不破坏其余代码的情况下更改类内部的实现。

于 2012-04-16T15:57:32.850 回答
15

这被称为多态性。想象以下示例:

Musician musician = new Pianist(); 

或者

Musician musician = new Drummer(); 

假设Musician类有一个方法:play(). 不管音乐家是谁,如果你调用 play 方法,你就会知道如何演奏确定的乐器,基于具体的课程,在这种情况下,无论是 Pianist 还是 Drummer。

每个具体类,覆盖它的play()方法,可以自己玩:

例如Pianist上课:play() { playsBeethoven(); }

详细信息请查看http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

记住将它与继承一起使用总是好的http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

于 2012-04-16T16:00:48.157 回答
9

这样做的主要原因是需要超类的函数调用。如果你有一个类A有这样的方法

public static void insert(SuperClass b) {
    //do something
}

你有

SuperClass object = new SubClass();

你可以做

A.insert(object);

但如果你这样做

SubClass object new SubClass();

你不能做

A.insert(object);

除非您将这样的方法添加到 A

public static void insert(SubClass b) {
     //do something
}

这可以帮助您减少冗余或复制的代码并保持清洁。

于 2012-04-16T15:59:52.043 回答
1

您所做的只是在编译时告诉 JVM 引用的类型。

在第一种情况下,您说对象引用具有超类的静态类型。当您创建一个新的子类对象时,您可以让该引用指向它,因为子类是超类实例。

于 2012-04-16T15:58:55.773 回答
1

这是您使用继承的主要原因之一。您将 SuperClass 视为抽象,并且在编译时您不需要知道派生类型,或者另一个类不需要知道派生类型。这允许您在使用多态性调用派生类的方法时使用对 SuperClass 的引用。

这使您能够

a.) 创建工厂,这样您就不需要在编译时知道类型,并且您有一些创建派生类型的运行时方法。想想 COM、GStreamer、DirectShow、Glib 等……

b.) 通过仅公开基类型引用来隐藏其他对象的复杂性,即使它们是派生类型的实例。考虑返回对象或将对象引用作为参数的方法。

c.) 更多可能性,但这些可能是与您最相关的两种用途。

于 2012-04-16T16:02:34.057 回答