繁体   English   中英

Java:抽象类的对象

[英]Java: Object of abstract class

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

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类的Object ,为什么这样做有效?

这行不是Player的实例吗?

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

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

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

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

您不能创建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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM