【问题标题】:Java: Object of abstract classJava:抽象类的对象
【发布时间】:2015-12-06 04:10:56
【问题描述】:

我对下面的代码感到困惑,其中Playerabstract 类:

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 中我不能创建 Objectabstract 类,为什么这样可以工作?

这行不是Player 的实例吗?

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

【问题讨论】:

    标签: java oop object abstract-class


    【解决方案1】:

    变量 p 持有对抽象类 Player 的子类实例的引用。由于 Player 是一个抽象类,因此不能创建它的实例。但是,抽象 Player 类的子类的实例仍然可以分配给变量 p。见https://www.computingnotes.net/java/abstract-class-in-java/

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 哇!知道了!玩家 P = new Defense() 会是一样的吗? (在我的情况下,防御扩展了玩家)
      • @Mucida:是的,类似。
      • 但是我为什么要把它投射到 (Player) 而不仅仅是这个:Player p = evt.getItem()?
      • @Mucida: 因为evt.getItem() 很可能被声明为返回Object 类型。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您不能创建abstract 类的实例,但您可以将子级强制转换为它的父级。在您的情况下,evt.getItem() 正在返回 child TennisPlayer),并且您将其转换为有效的超类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

        【讨论】:

        • 嗯。这就是为什么演员 (Player) evt.getItem() 可以“找到”子类 Defense?
        猜你喜欢
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多