![](/img/trans.png)
[英]Having 2 variables with the same name in a class that extends another class in Java
[英]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
,因為對象沒有字段member
, House
沒有。 但是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.