Java: Casting ParentClass und ChildClass (Niedergeschlagen Runtime Error)
public class InheritanceDemo {
public static void main(String[] args) {
ParentClass p = new ParentClass();
ChildClass c = new ChildClass();
//Casting ChildClass to ParentClass
ParentClass pc = new ChildClass();
pc.parentClassMethod(); //Output: Parent Class Method (as expected)
//Again Casting Parent Class to ChildClass explictly
//Question 1 for this code
ChildClass cp = (ChildClass) pc;
cp.parentClassMethod(); //Output: Parent Class Method (unexpected)
ChildClass cc1 = (ChildClass) new ParentClass();
cc1.parentClassMethod(); //Compiles, but Run Time Error
ChildClass cc2 = (ChildClass) p;
cc2.parentClassMethod(); //Compiles, but Run Time Error
}
}
class ParentClass {
public void parentClassMethod(){
System.out.println("Parent Class Method");
}
}
class ChildClass extends ParentClass {
public void ParentClassMethod(){
System.out.println("Parent Class Method From Child Class");
}
public void ChildClassMethod(){
System.out.println("Child Class Method");
}
}
Frage 1:
Nun, ich habe eine Methode namens parentClassMethod
in beiden ParentClass
und ChildClass
Klassen(außer Kraft gesetzt). Wenn ich cast den ParentClass
zu ChildClass
und rufen Sie dann die parentClassMethod, warum ist es, die Ausführung der ParentClass
- Methode anstelle der Methode von ChildClass
wenn cp bezieht sich auf ChildClass
?
Question2:
(i) ChildClass cp = (ChildClass) pc;
(ii) ChildClass cc1 = (ChildClass) new ParentClass();
(iii) ChildClass cc2 = (ChildClass) p;
Wenn (ich) ist in Ordnung, warum nicht (ii) oder (iii)?
Weil ich am casting von ParentClass
zu ChildClass
in beiden Fällen?
InformationsquelleAutor Sudheer | 2013-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, Sie nicht. Sie haben eine Methode mit dem Namen
parentClassMethod
imParentClass
und eine Methode mit dem NamenParentClassMethod
imChildClass
. Da alle Java-Bezeichner sind case-sensitive, es gibt keine Verbindung zwischen den beiden.ParentClassMethod
nicht überschreibenparentClassMethod
ausParentClass
.In (ii) und (iii) die Sie versuchen zu casten, die eine Instanz von
ParentClass
zu einer Instanz vonChildClass
. Das ist nicht erlaubt, alsChildClass
ist-nicht-einParentClass
, mehr als einObject
ist einString
.In (i) Sie versuchen zu casten, die eine Instanz von
ChildClass
(gespeichert in der Referenz erklärtParentClass
) zu einemChildClass
, was erlaubt ist.Beim casting, es ist die Laufzeitumgebung Art, die zählt (in anderen Worten, was
T
verwendet wird, innew T()
).@Override
annotation. Wenn man es aufChildClass#ParentClassMethod()
erhalten Sie eine Fehlermeldung, in der Sie in der Tat (am besten Mandy Patinkin/Inigo Montoya Prinzessin Braut-Akzent) "ich glaube nicht, dass die Methode überschreibt, was Sie denken, es überschreibt".Dank Mark, für die Antwort. Es war mein Fehler im Programm, wo ich tippte ParentClassMethod statt parentClassMethod. Jetzt kann ich den Unterschied sehen. Es funktioniert!!!
Wenn ich warf einen ParentClass Objekt zu einer ChildClass-Objekt dann kann ich den Zugriff auf die Methoden in beiden ParentClass und ChildClass. Aber wie ist es erlaubt, den Zugriff auf die Methoden ein, wenn ich warf einen ChildClass Objekt in ParentClass Objekt? also ich muss gestattet werden, die nur Zugriff auf Methoden innerhalb von ParentClass Recht? Bitte stellen Sie das klar? Danke.
Wenn ich warf einen ParentClass Objekt zu einer ChildClass-Objekt dann kann ich den Zugriff auf die Methoden in beiden ParentClass und ChildClass. Gießen eine Instanz von
ParentClass
zuChildClass
wird immer scheitern, also welche Methoden können Sie verwenden, ist unerheblich. Wenn Sie meinen, Sie hatten eineChildClass
in einem variable erklärtParentClass
, und Sie gegossen, daßChildClass
, dann ist das richtig. Wenn Sie eineChildClass
imParentClass
typisierte variable können Sie nur sehen die Methoden ausParentClass
, aber zur Laufzeit wird die spezifischste Methode (ChildClass
) wird noch genannt werden.InformationsquelleAutor Mark Peters
Lets go zurück zum jdk 1.4 bei Generika sind es nicht.
Nun beim abrufen, was Sie tun:
Also string war zunächst gespeichert, wie ein Objekt in Vektor und dann downcasted es zu String und es ging gut.
Aber wenn Sie versuchen, folgende, es wird nicht funktionieren:
So können Sie sehen, dass im ersten Fall war es der String, sondern die Referenz wurde von Objekt [inside vector], in diesem Szenario können Sie niedergeschlagen und es wird funktionieren.
Zur Beantwortung Ihrer ersten Frage java ist case-Sensitiv und bei deiner Methode die Namen nicht übereinstimmen.
InformationsquelleAutor Lokesh