[英]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.