使用超类初始化子类对象Java

Using superclass to initialise a subclass object java

本问题已经有最佳答案,请猛点这里访问。
1
SuperClass object = new SubClass();

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

1
SubClass object = new SubClass();

我在学习Java。


您可能有一个只接受SuperClass实例的方法。由于SubClassSuperClass,您可以使用SubClass的一个实例,将其视为SuperClass

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

1
List someList = new ArrayList();

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


这就是所谓的多态性。想象一下下面的例子:

1
Musician musician = new Pianist();

1
Musician musician = new Drummer();

假设Musician类有一个方法:play()。不管音乐家是谁,如果你称之为演奏方法,你将知道如何演奏确定的乐器,基于具体的课程,在这种情况下,无论是钢琴家还是鼓手。

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

例如,对于Pianist类:play() { playsBeethoven(); }

有关详细信息,请查看http://docs.oracle.com/javase/tutorial/java/iandi/多态性.html

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


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

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

而且你有

1
SuperClass object = new SubClass();

你可以做到

1
A.insert(object);

但是如果你这样做

1
SubClass object new SubClass();

你做不到

1
A.insert(object);

除非将类似的方法添加到

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

这有助于减少冗余或复制的代码,并使事情更干净。


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

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


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

这使您能够

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

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

更多的可能性,但这些可能是你最相关的两个用途。