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

使用超类初始化子类对象java,java,Java,为什么要使用超类来实例化上述子类对象?因为我学会实例化对象的唯一方法是: SuperClass object = new SubClass(); 我正在学习java。您可能有一个方法,它只接受超类的一个实例。由于子类是一个超类,因此可以使用子类的实例并将其视为超类 使用接口时使用相同的行为: SubClass object = new SubClass(); 这就是多态性的美妙之处。它允许您在不破坏其余代码的情况下更改类内部的实现。您所做的只是在编译时告诉JVM引用的类型 在第一种情况下,您

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

SuperClass object = new SubClass();

我正在学习java。

您可能有一个方法,它只接受
超类的一个实例。由于
子类
是一个
超类
,因此可以使用
子类
的实例并将其视为
超类

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

SubClass object = new SubClass();

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

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


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

执行前者的主要原因是用于预期超级类的函数调用。如果您有一个类
a
,它有这样一个方法

List someList = new ArrayList();
你有

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

SuperClass object = new SubClass();
但如果你这样做了

A.insert(object);
你做不到

SubClass object new SubClass();
除非您将这样的方法添加到

A.insert(object);

这有助于减少冗余或复制的代码,并保持代码的整洁。

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

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

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

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

e、 g.对于
钢琴家
类:
play(){playsBeethoven();}

有关详细信息,请查看


记住将它与继承一起使用总是好的

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

这使您能够

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

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


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

这里的关键是
子类
是一个
超类
。这种行为在Java 8中改变了吗?我刚刚测试了一个案例,其中一个方法接受一个超类参数
void方法(超类参数)
,但我能够放入一个子类实例
subclass sub=new subclass()当我调用它时,如
方法(sub)。这意味着现在允许向上兼容了?很好的解释方式难道你不能在方法参数中使用某种泛型类型来更好地处理这个问题吗?接口中使用的不是同样的吗?例如,``List mList=new ArrayList();```-我们只使用接口中定义的列表的已知方法,而不关心ArrayList的具体实现。
Musician musician = new Pianist(); 
Musician musician = new Drummer();