Java:抽象类的对象

Java:抽象类的对象,java,oop,object,abstract-class,Java,Oop,Object,Abstract Class,我对下面提到的代码感到困惑,其中Player是一个abstract类: private void cbxTeamAItemStateChanged(java.awt.event.ItemEvent evt) { if (evt.getStateChange() == ItemEvent.SELECTED) { Player p = (Player) evt.getItem(

我对下面提到的代码感到困惑,其中
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中,I不能创建
抽象类的
对象
,为什么这样做

这行不是
Player
的一个实例吗

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

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

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

变量p包含对抽象类玩家子类实例的引用。因为Player是一个抽象类,所以不能创建它的任何实例。但是,抽象Player类的子类的实例仍然可以分配给变量p。请参见

变量p包含对抽象类Player子类实例的引用。因为Player是一个抽象类,所以不能创建它的任何实例。但是,抽象Player类的子类的实例仍然可以分配给变量p。请参见

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

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

您不能创建
抽象类的实例,但可以将子类向上转换为其父类。在您的情况下,
evt.getItem()
将返回
子项(即
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
肯定是一个
水果

您不能创建
抽象类的实例,但您可以向上投射子类到它的父类。在您的情况下,
evt.getItem()
将返回
子项(即
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;
    }

}

注意,向上投射子对象到其父对象是有效的,因为(即)每个
芒果
肯定是
水果

噢!知道了!这和玩家P=新防御()是一样的?(在我的例子中,防御扩展了玩家)@Mucida:是的,类似于此。但是为什么我要将它转换为(玩家),而不仅仅是这个:Player p=evt.getItem()?@Mucida:因为
evt.getItem()
很可能被声明为返回
Object
type.Ow!知道了!这和玩家P=新防御()是一样的?(在我的例子中,Defense extends Player)@Mucida:是的,类似于此。但是为什么我要将其转换为(Player),而不仅仅是这个:Player p=evt.getItem()?@Mucida:因为
evt.getItem()
很可能被声明为返回
Object
type.Humm。这就是为什么演员(玩家)evt.getItem()可以“找到”子类Defense?哼哼。这就是为什么cast(Player)evt.getItem()可以“找到”子类defence?