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

use*_*548 20 java

SuperClass object = new SubClass();
Run Code Online (Sandbox Code Playgroud)

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

SubClass object = new SubClass();
Run Code Online (Sandbox Code Playgroud)

我正在学习java.

Jus*_*ner 15

您可能有一个只接受实例的方法SuperClass.既然SubClass 是a SuperClass,你可以使用一个实例SubClass并将其视为SuperClass.

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

List someList = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

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

  • 这里的关键是`SubClass`*是*SuperClass`. (4认同)

axc*_*dnt 14

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

Musician musician = new Pianist(); 
Run Code Online (Sandbox Code Playgroud)

要么

Musician musician = new Drummer(); 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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


twa*_*249 6

做前者的主要原因是对期望超类的函数调用.如果你有一个类A有这样的方法

public static void insert(SuperClass b) {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

你有

SuperClass object = new SubClass();
Run Code Online (Sandbox Code Playgroud)

你可以做

A.insert(object);
Run Code Online (Sandbox Code Playgroud)

但如果你这样做

SubClass object new SubClass();
Run Code Online (Sandbox Code Playgroud)

你不能这样做

A.insert(object);
Run Code Online (Sandbox Code Playgroud)

除非你向A添加这样的方法

public static void insert(SubClass b) {
     //do something
}
Run Code Online (Sandbox Code Playgroud)

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