假設我有一個名爲Food的類,並且在構造函數中它具有價格,卡路里數量和描述的屬性。我可以通過Java中的超類引用訪問子類對象的屬性嗎?
我也有一個稱爲漢堡的食物的子類,漢堡有一個類型的肉額外的屬性。
現在,如果我創建一個包含Burger類實例的Food實例數組,我可以通過數組訪問類型的meat屬性嗎?
對不起,如果這是混淆,但我想知道我是否可以(以及如何)訪問父對象和子對象數組中的父屬性和子屬性。我也使用Java。
假設我有一個名爲Food的類,並且在構造函數中它具有價格,卡路里數量和描述的屬性。我可以通過Java中的超類引用訪問子類對象的屬性嗎?
我也有一個稱爲漢堡的食物的子類,漢堡有一個類型的肉額外的屬性。
現在,如果我創建一個包含Burger類實例的Food實例數組,我可以通過數組訪問類型的meat屬性嗎?
對不起,如果這是混淆,但我想知道我是否可以(以及如何)訪問父對象和子對象數組中的父屬性和子屬性。我也使用Java。
即使存儲在Food
的數組中,也可以訪問Burger
的屬性。首先,您需要將其轉換爲Burger
,以便您的程序知道它是什麼類型。由於並非所有對象都是Food
,因此最好首先檢查其類型。事情是這樣的:
Food[] myFoods; //your food array
if (Burger.isInstance(myFoods[0])) { //check that the Food is a Burger
((Burger)myFoods[0]).meatType; //cast the object to a Burger and access its property
}
謝謝!這很有道理。我現在擁有的方式是我有兩個獨立的數組,但現在我只能有一個對象數組。 – Skistar002
@ Skistar002樂意幫忙!如果這解決了你的問題,我真的很感激upvote或接受。 – nhouser9
在你的情況下,子類Burger
的meat
屬性是特定於該子類,因此唯一的選擇就是到Food
對象向下轉換Burger
,你要訪問它的漢堡時間特定屬性。如果你的集合(數組)包含不同的子類,那麼這是充滿了問題的,因爲這個轉換可能會失敗。
Food[] foods = new Food[n];
Food[0] = new Burger(...);
Food[1] = new Vegetable(...);
Meat m1 = ((Burger)foods[0]).getMeat(); // This is OK
Meat m2 = ((Burger)foods[1]).getMeat(); // ClassCastException
或者更好
for (Food f : foods)
{
if (f instanceof Burger)
{
Meat m = ((Burger)foods[0]).getMeat();
// other Burger-related processing
}
else if (f instanceof ...someothersubclass)
{
...
這往往是相當脆弱的,但你不能使用多態來這裏精簡的東西。運行時(動態)調度僅適用於重寫的方法。編譯時解析同一類中的重載方法。
您將不得不施放:((漢堡)食物[索引])。getMeatType –
構造函數沒有屬性。只有對象實例才具有屬性。你的問題應該是「我可以通過超類參考訪問子類對象的屬性」 –
甜,謝謝。你能否試着解釋究竟發生了什麼? Food實例是否被投入Burger實例? 感謝您的澄清。所以構造函數具有屬性而對象具有屬性? – Skistar002