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?