2016-06-25 6 views
-4

mit folgenden Klassenhierarchie:JAVA-Klassenhierarchie: Welche der folgenden Zeilen wird nicht kompiliert?

Interface Animal {…} 
class Dog implements Animal{…} 
class Poodle extends Dog {…} 
class Labrador extends Dog {…} 

Welche der folgenden Zeilen kompiliert nicht?

Poodle poodle = new Poodle(); //1 
Animal animal = (Animal) poodle; //2 
Dog dog = new Labrador(); //3 
animal = dog; //4 
poodle = dog; //5 
Animal labrador = new Labrador(); //6 
Dog dog2 = new Labrador(); //7 
dog 2=labrador;//8 

Ich denke Linie 5: wegen der statischen Bindung des Pudels und des Hundes.

Zeile 8: nur statische Bindung ist für eine Zuweisung relevant.

Bin ich richtig? Kannst du eine Erklärung geben?

+0

Der Punkt des Instruktors, der Ihnen diese Frage stellt, ist für ** Sie **, um es zu beantworten, basiert auf Forschung. Andere Leute zu bitten, es für dich zu beantworten, ist keine Forschung. Auch wenn du deine eigene Teilantwort postest. –

+0

ist es für die Testüberprüfung – student

+0

Um TJ's Kommentar hinzuzufügen, könnten Sie versuchen, den Code zu kompilieren und dann sehen, was fehlschlägt und welchen Fehler Sie erhalten. –

Antwort

0

Sie haben Recht, Aussagen 5 und 8 werden fehlschlagen.

5> Sie können das Objekt einer übergeordneten Klasse nicht der Ref-Variable einer untergeordneten Klasse zuweisen. Ein Pudel ist definitiv ein Hund. Aber ein Hund darf kein Pudel sein.

8> Gleiches gilt auch für Zeile 8. Dies wäre jedoch in Ordnung: dog2= (Dog)labrador;

Hinweis: Die explizite Typumwandlung in Zeile 8 wäre in Ordnung, da Labrador das Objekt von Labrador ist, welches eine weitere Unterklasse von Dog ist. Wenn Sie versuchen, das gleiche im Fall von (5) zu tun, wie

poodle = (Poodle)dog; 

wäre es kompilieren würde aber zur Laufzeit fehlschlagen - wegen des einfachen Grundes - dog bezieht sich auf ein Labrador. dog.getClass() würde Labrador.class zurückgeben. Damit dieses Objekt von einem beliebigen Verweis referenziert wird, sollte der Verweis der einer Klasse/Schnittstelle sein, die in die obere Hierarchie der ursprünglichen Klasse des Objekts gehört. Ein Labrador, obwohl er ein Hund ist, ist definitiv kein Pudel.

Auch die explizite Typumwandlung getan ist Zeile 2 ist nicht sehr nützlich, da es implizit erfolgt ist. Das Folgende ist, wo ein expliziter typecase erforderlich wäre:

Dog d = new Labrador(); 
Labrador lbd = (Labrador) d; 
+0

Warum wird kein Wurf mit der Linie 5 helfen? – student

+0

Einige Änderungen hinzugefügt. Dies sollte dir helfen. Warum sollte jemand meine Antwort ablehnen? : P Atleast haben die Demut, einen Kommentar hinzuzufügen, wenn Sie so tun .. –

+0

Danke! Wofür steht "ref"? – student

Verwandte Themen