java - 何时使用抽象类作为类型

标签 java inheritance abstract-class instantiation

因此,在尝试理解抽象类时,我仍然对一件事感到困惑。您什么时候想声明其抽象类的对象类型。例如

public abstract class GameObject
{
 public abstract void draw();
 public static void main(String[] args)
 {
 GameObject player = new Player();
 Menu menu = new Menu();
 }

}
public class Player extends GameObject
{
 override 
 public void draw()
 {
 // Something
 }

}
public class Menu extends GameObject
{
 override 
 public void draw()
 {
 // Something
 }
}

通常,我只会实例化一个播放器类型的播放器对象。但是,我已经看到抽象类被用作新对象的变量类型。你什么时候会选择这样做?谢谢!

最佳答案

每次您需要将变量作为抽象类的实例时,您都会这样做,但并不真正关心具体类型是什么(并且不希望其余代码采用特定的子类用来)。例如:

GameObject[] gameObjects = new GameObject[] {new Menu(), new Player()};
drawAll(gameObjects);

...

private void drawAll(GameObject[] gameObjects) {
    for (GameObject gameObject : gameObjects) {
        gameObject.draw();
    }
}

抽象类型通常用作返回类型(因为您不希望调用者知道返回的具体类型:它可能会在以后更改,或者可能会根据配置的参数而变化)。

它也常被用作方法的参数类型,使方法可以接受抽象类型的任何子类的参数,并以多态方式使用它。

当然,作为数组/集合类型,能够将多个子类的实例存储在一个唯一的集合中。

关于java - 何时使用抽象类作为类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33457393/

相关文章:

java - 子类可以创建抽象父类(super class)类型的对象吗?

java - 方法上的类型不兼容

inheritance - 有区别的联合成员方法

c++ - 如何在 C++ 中编程为接口(interface)/抽象类?

c# - 在静态函数中调用重载基类的函数?

c++ - C++如何区分派(dispatch)生类的对象

c++ - 如何为抽象类的未知子类分配内存

java - 如何让 Java 在继续之前等待方法完成?

java - Fop 库出现 NoSuchMethodError

java - Websphere 应用程序服务器和 Eclipse 使用的 JRE 版本是否应该具有完全相同的版本号?