2016-07-10 10 views
-1
//code-1 
       Emp1 emp11 = new Emp2(); 
       ((Emp2) emp11).displayEmp2(); 

    //code-2 
       Emp1 emp11 = new Emp2(); 
       emp11 = (Emp2) emp11;  //line-1 
       (emp11).displayEmp2();  //line-2 

class Emp1 { 
    public void displayEmp1(){     
     System.out.println("displayEmp1");  
    } 
} 

class Emp2 extends Emp1 { 
    public void displayEmp2(){ 
     System.out.println("displayEmp2");   
    } 
} 

Warum Code-1 unterscheidet sich von Code-2. Code-1 wird erfolgreich ausgeführt, aber Code-2 gibt einen Kompilierungsfehler bei Zeile-2. Obwohl, das gleiche in beiden Stück Code zu tun. Ich verstehe, dass es nicht in der Lage sein wird, die Methode in der Superklasse während der Kompilierungszeit zu finden. Aber mein Zweifel ist, wenn es bereits explizit bei Zeile-1 konvertiert, warum es Kompilierungsfehler wirft. Wenn es so ist, dann sollte es auch Fehler für Code-1 auch werfen.Polymorphismus und explizites Gießen des Objekts

+0

https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html – emotionlessbananas

+0

anrufen wollen zuerst lesen – emotionlessbananas

+0

'Emp1 emp11 'bedeutet' emp11' ist eine Referenz auf 'Emp1'. Keine Menge an Casting wird das ändern. –

Antwort

1

Casting emp11-Emp2 hat keine Bedeutung, wenn später Sie es emp11 zuweisen zurück, deren Typ Emp1. Eine Variable, deren Typ Emp1 ist, ermöglicht es Ihnen, nur Methoden der Klasse Emp1 aufzurufen.

Um für das zweite Snippet die verhalten sich wie die erste, dann sollten Sie das Ergebnis des Gusses auf eine Variable vom Typ Emp2 zuweisen:

Emp1 emp11 = new Emp2(); 
Emp2 emp2 = (Emp2) emp11; 
emp2.displayEmp2(); 
+0

ya ich habe, es ist mein schlechtes :(... danke Eran – MAX

3

Sie erhalten einen Kompilierungsfehler, da diese Zeile (emp11).displayEmp2(); ein ungültig Java-Anweisung Sie müssen einen Typ (Klassennamen) innerhalb der Csating-Klammer

geben, zusätzlich muss das Downcasting in derselben Anweisung erfolgen, die den Methodenaufruf ausführt. emp11 ist vom Typ Emp1 definiert. es muss jedes Mal explizit gecastet Sie eine Methode aus der Unterklasse

Emp1 emp11 = new Emp2(); 
emp11 = (Emp2) emp11; 
emp11.displayEmp2(); // emp11 returned to type Emp1 
((Emp2)emp11).displayEmp2(); // every call to emp2 method has to be explicitly cast 
+0

aber es ist instanziiert mit Unterklasse nur dann im nächsten Schritt mit expliziten Casting kann ich das richtig machen? – MAX