Java: 抽象的对象 class

Java: Object of abstract class

我对下面所述的代码感到困惑,其中 Player 是一个 abstract class:

private void cbxTeamAItemStateChanged(java.awt.event.ItemEvent evt) {                                          
        if (evt.getStateChange() == ItemEvent.SELECTED) {
            Player p = (Player) evt.getItem();
            if(P.getTipo().contains("Defense")){
                lblDefense1.setText("Skill:");
            }
        }
}

如果在 Java 中,我 不能 创建一个 abstract class 的 Object,为什么会这样?

这一行不是 Player 的实例吗?

Player p = (Player) evt.getItem();

您混淆了变量和实例。 p 是一个 Player 变量,evt.getItem() returns 一个扩展 Player 类型的 具体实例 (如果 Player 是一个接口,则实现 Player) . Player 的确切子类型并不重要,因为您需要知道的是它遵守 Player 抽象 class 契约,因此具有所有必要的 Player 行为。

变量 p 包含对抽象 class Player 的 subclass 实例的引用。由于 Player 是抽象的 class,因此无法创建它的实例。但是,抽象 Player class 的 subclass 的实例仍然可以分配给变量 p。参见 https://www.computingnotes.net/java/abstract-class-in-java/

即使您不能直接构造抽象 class 对象,您也可以拥有具有抽象 class 作为其类型的对象。 evt.getItem() 有一个特定的非抽象类型,它在幕后 returns,并且该类型使用一些特定代码实现 Player。如果有一天,他们想更改 class 的名称,他们可以,并且只要它继续实现 Player 中的所有方法,它就不会影响这段代码。基本上,这从您那里抽象出了该对象的细节,并且只向您保证在某个地方,有人实现了 Player 应该在该对象中具有的所有方法。

您不能创建 abstract class 的实例,但您可以将子项向上转换为它的父项。在你的情况下 evt.getItem() 正在返回 child TennisPlayer)并且你正在将它转换为 super class Player 这是有效的。

考虑以下示例,

class Mango extends Fruit {}

abstract class Fruit {}

public class Test {

    public static void main(String[] args) {
        Mango mango = new Mango();
        //Note that mango is also fruit
        Fruit fruit = (Fruit) mango;
    }

}

请注意,将子对象转换为父对象是有效的,因为()每个Mango 肯定一个Fruit.