Bindung bzw warum wird diese Methode aufgerufen?
-
Hallo JavaFans,
ich verzweifle langsam an meinem Problem. Ich versteh einfach nicht, wie Bindung funktioniert.Ich soll ein Programm schreiben, um zu testen warum bei gleichnahmigen Methoden bestimmte methoden aufgerufen werden. Das ist soweit kein Geheimnis. Die Signatur und wie speziell eine Methode ist. So weit so gut. Jetz habe ich ein Testprogramm, bei dem Java mir Teilweise andere Werte ausgibt, als ich sie mir vorher berechnet habe. Ich komme einfach nicht dahinter warum dies so ist.
folgendes programm:public class Print1{ int x = 1; public void print(A a){ System.out.println(x); } public void print(B b){ System.out.println(x+1); } }
public class Print2 extends Print1{ int x = 3; public void print(A a){ System.out.println(x); } public void print(B b){ System.out.println(x+1); } public void print(C c){ System.out.println(x+2); } }
public class test2{ public static void main(String []args){ A a = new A(); B b = new B(); C c = new C(); Print1 p1 = new Print1(); Print2 p2 = new Print2(); p1=p2; System.out.println(p1.x);//Aufruf 1 System.out.println(((Print2)p1).x);//Aufruf 2 p1.print(c); //Aufruf 3 ((Print2)p1).print(c);//Aufruf 4 ((Print1)p2).print(b);//Aufruf 5 ((Print1)p2).print(c);//Aufruf 6 p2.print(c);//Aufruf 7 p1 = new Print1(); ((Print2)p1).print(a);//Aufruf 8 } } class A{} class B extends A{} class C extends B{}
also meinen eigenen Berechnungen zufolge kommt diese Ausgabe heraus:
1,2,5,5,2,4,5,3java jedoch gibt mir das hier aus:
1,3,4,5,4,4,5 und eine ClassCastExceptionmeine Frage ist ganz einfach, warum nimmt Java bei dem Aufruf 3 das print(B b) statt dem print(C c)? Analog mit den anderen Werten. Woran liegt das?Wo ist mein Denkfehler?und warum ist hier die ClassCastException? Hab schon nach Hilfe gefragt, wurde aber nicht schlau daraus.
Danke schonmal im voraus
Mfg Wurmi
-
zu3: da print(C c) in in Print1 nich bekannt is wird c auf(B) gecastet und die methode print(B b) aus Print1 ausgeführt.
zu4: sollte so sein. (p1 is n Print2 wird darauf gecastet und die methode genutzt)
zu 5: java weiss dass p2 trotz des castes auf(Print1) n Print2 ist; nutzt also die methode aus Print2 dort is aber x verdeckt und es wird 3+1 gerechnet
zu 6: siehe 3
zi 7: in zeile 10 wird p1 ein object der klasse Print1 zugewiesen. daher exceptionps wär nett, wenn du denmächt die bezeichner anders wählst. breche mir schon die zunge beim schreiben. und verstänlicher wirds auch nich, wenn alles print heisst.
-
Danke für die Antwort.
aber folgendes:
0815 schrieb:
zu3: da print(C c) in in Print1 nich bekannt is wird c auf(B) gecastet und die methode print(B b) aus Print1 ausgeführt.
java gibt doch aber 4 aus. die print(B b) aus Print 1 gibt doch aber 2 aus. oder was passeirt da?
Gruss Wurmi
-
sry den pkt nich ganz ausgeführt:
zu 3:
print(C c) ist in Print1 nich vorhanden
->c wird auf (B) gecastet um print(B b) aus Print 1 zu nutzen.
->da aber p1 n Print2 ist wird die übrschriebene methode print(B b) aus Print2 benutzt...
->und mit dem verdeckten x in Print2 kommt man auf 4d.h. java nutzt immer die überschriebene methodedes objectes, selbst, wenn man es explizit auf eine vaterklasse castet.
-
Fantasitsch,
habe bestimmt schon zehn erklärungen bekommen, aber es ist endlich eine, die ich nachverfolgen kann
ich glaube algorthmisch lässt es sich sowieso am besten erklären.
aber ich versteh trotzdem noch nicht warum die exception. ich nehme an du meinst zeile 17 und 18 und aufruf 8 oder?
weil ich caste ja auch vorher schon mit (Print2)p1).print(c). Warum ist also hier die exception?0815 schrieb:
zi 7: in zeile 10 wird p1 ein object der klasse Print1 zugewiesen. daher exception
vielen dank nochmal
schönen tag noch
-
z7: p1 ist ein Print1
z8: p2 ist ein Print2 und (damit auch ein Print1)
z9: p1 und p2 zeigen aus selbe Object -> p1 ist ein Print2 und (damit auch ein Print1)
z11...16: s.o.
z17: es wird ein neues Print1 angelegt und p1 zugewiesen -> p1 ist ein Print1 und nur ein Print1 -> kann nicht auf Print2 gecastet werden
-> z18: ClassCastException
-
z17: es wird ein neues Print1 angelegt und p1 zugewiesen -> p1 ist ein Print1 und nur ein Print1 -> kann nicht auf Print2 gecastet werden
Du versuchst in deinem Fall eine Super-Klasse zu einer Child-Klasse zu casten, da das ist nicht möglich ist wird eine ClassCastException geworfen.