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
.
我对下面所述的代码感到困惑,其中 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
.