2016-04-26 76 views
3

假設我有一個名爲Food的類,並且在構造函數中它具有價格,卡路里數量和描述的屬性。我可以通過Java中的超類引用訪問子類對象的屬性嗎?

我也有一個稱爲漢堡的食物的子類,漢堡有一個類型的肉額外的屬性。

現在,如果我創建一個包含Burger類實例的Food實例數組,我可以通過數組訪問類型的meat屬性嗎?

對不起,如果這是混淆,但我想知道我是否可以(以及如何)訪問父對象和子對象數組中的父屬性和子屬性。我也使用Java。

+0

您將不得不施放:((漢堡)食物[索引])。getMeatType –

+0

構造函數沒有屬性。只有對象實例才具有屬性。你的問題應該是「我可以通過超類參考訪問子類對象的屬性」 –

+0

甜,謝謝。你能否試着解釋究竟發生了什麼? Food實例是否被投入Burger實例? 感謝您的澄清。所以構造函數具有屬性而對象具有屬性? – Skistar002

回答

2

即使存儲在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 
} 
+0

謝謝!這很有道理。我現在擁有的方式是我有兩個獨立的數組,但現在我只能有一個對象數組。 – Skistar002

+0

@ Skistar002樂意幫忙!如果這解決了你的問題,我真的很感激upvote或接受。 – nhouser9

1

在你的情況下,子類Burgermeat屬性是特定於該子類,因此唯一的選擇就是到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) 
    { 
     ... 

這往往是相當脆弱的,但你不能使用多態來這裏精簡的東西。運行時(動態)調度僅適用於重寫的方法。編譯時解析同一類中的重載方法。

相關問題