簡體   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