簡體   English   中英

在擴展另一個類的類之外訪問變量

[英]Access variables outside a class that extends another class

如何在擴展了數組列表中使用的其他類的類之外訪問變量? 我收到一條錯誤消息,指出擴展類中不存在該變量。 看一下,我想訪問變量成員而不必在我的Object類中聲明它:

public abstract class Object {
    public int x, y;
}

public class House extends Object {
    public int members = 10;
}

// Somewhere else
ArrayList<Object> list = new ArrayList<Object>();
list.add( new House() );
for (Object o : list ) {
    o.members;
}

問題是在我正在編寫的RTS中,我的Object類具有40多個變量,僅因為僅在子類中聲明它們並從外部訪問它們是不起作用的。 希望你能理解。 我怎樣才能做到這一點?

您可以使用instanceof和強制類型轉換:

for (Object o : list ) {
    if (o instanceof House) {
        h = (House) o;
        h.members;
    }
}

但是,這通常被認為是不好的設計。 您應該考慮在Object定義一個適當的方法( 確實應該有另一個名稱,正如其他人指出的那樣),並在House重寫它。 然后,您可以在不知道對象所引用的對象類型的情況下在Object上調用該方法,如果它是House ,則將調用正確的方法。 (學習如何正確執行此操作以及何時執行此操作需要一些練習-谷歌多態重寫 。)

首先,不要為您的類Object命名(請參閱注釋)。 您無法在代碼中訪問Object member ,因為對象沒有字段memberHouse沒有。 但是Object不必是House ,因此不能保證它有member

如果您確定在這種情況下,您的Object 始終House ,則將其強制轉換為:

    ((House) anObject).member;

這樣,編譯器假定您比他對Object的實際類了解更多,並且像對待House一樣處理它。 您可以使用instanceof檢查強制類型轉換是否有效。

希望您理解您將類的名稱用作“對象”,這是Java中所有類的父類。 現在,在您的環境中將有兩個Object類,一個是Java從java.lang.Object提供的,另一個是您創建的。 因此,當您嘗試訪問類對象並嘗試獲取其對象的屬性時,它實際上不是您的類對象,而是java.lang.Object的實例,因此您遇到了問題。

您必須將o投向房屋。 例如((House) o).members

只是像這樣轉換arraylist的成員

((House)o).members;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM