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

SuperClass object = new SubClass(); 

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

 SubClass object = new SubClass(); 

我正在学习java。

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

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

 List someList = new ArrayList(); 

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

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

 Musician musician = new Pianist(); 

要么

 Musician musician = new Drummer(); 

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

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

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

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

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

做前者的主要原因是对期望超类的函数调用。 如果你的AA这样的方法

 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 } 

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

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

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

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

这使你能够

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

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

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