2016-04-26 5 views
3

Nehmen wir an, ich habe eine Klasse namens Essen und im Konstruktor hat es Attribute für Preis, Anzahl der Kalorien und eine Beschreibung.Kann ich auf die Eigenschaften eines Unterklassenobjekts über eine Oberklassenreferenz in Java zugreifen?

Ich habe auch eine Unterklasse von Essen namens Burger, und der Burger hat ein zusätzliches Attribut für die Art von Fleisch.

Wenn ich nun ein Array von Food-Instanzen erstellen, die Instanzen der Burger-Klasse enthalten, kann ich über das Array auf den Typ des Fleischattributs zugreifen?

Entschuldigung, wenn das verwirrend ist, aber ich möchte wissen, ob ich (und wie) auf Eltern- und Kindeigenschaften in einem Array von Eltern- und Kindobjekten zugreifen kann. Ich benutze Java auch.

+0

Sie müssen Folgendes umsetzen: ((Burger) foods [index]). GetMeatType –

+0

Ein Konstruktor hat keine Eigenschaften. Nur Objektinstanzen haben Eigenschaften. Ihre Frage sollte lauten "Kann ich auf die Eigenschaften eines Unterklassenobjekts über eine Oberklassenreferenz zugreifen" –

+0

Süße, danke. Könnten Sie versuchen zu erklären, was genau passiert? Wird die Food-Instanz in eine Burger-Instanz umgewandelt? Danke für die Klarstellung. Also hat ein Konstruktor Attribute und ein Objekt hat Eigenschaften? – Skistar002

Antwort

2

Sie können auf die Eigenschaften eines Burger zugreifen, auch wenn es in einem Array von Food gespeichert ist. Zuerst müssen Sie es in eine Burger umwandeln, damit Ihr Programm weiß, um welchen Typ es sich handelt. Da nicht alle Objekte in Ihrem Array von FoodBurger s sind, ist es eine gute Idee, zuerst seinen Typ zu überprüfen. Etwas wie folgt aus:

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

Vielen Dank! Das macht sehr viel Sinn. So wie ich es jetzt habe, habe ich zwei separate Arrays, aber jetzt kann ich nur ein Array von Objekten haben. – Skistar002

+0

@ Skistar002 Glücklich zu helfen! Wenn dies Ihr Problem gelöst hat, würde ich eine positive Bewertung oder eine Annahme sehr begrüßen. – nhouser9

1

In Ihrem Fall die Unterklasse Burger ‚s meat Attribut ist spezifisch für diese Unterklasse, so dass die einzige Möglichkeit ist, die Food Objekt Burger zu niedergeschlagenen, an der Zeit, die Sie möchten, um ihre Burger zugreifen -spezifische Eigenschaften. Dies ist mit Problemen behaftet, wenn Ihre Sammlung (Array) verschiedene Unterklassen enthält, da der Cast fehlschlagen kann.

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 

Oder besser

for (Food f : foods) 
{ 
    if (f instanceof Burger) 
    { 
     Meat m = ((Burger)foods[0]).getMeat(); 
     // other Burger-related processing 
    } 
    else if (f instanceof ...someothersubclass) 
    { 
     ... 

Dieser neigt dazu, eher spröde zu sein, aber man kann nicht Polymorphismus Dinge zu straffen hier verwenden. Der Runtime-Versand (dynamisch) funktioniert nur für überschriebene Methoden. Überladene Methoden in derselben Klasse werden zur Kompilierzeit aufgelöst.

Verwandte Themen