Casting
-
völlig sinnlose Anwendung eines Casts...und das soll Anfägern den Sinn eines Casts klar machen
-
Das Beispiel würde nicht mehr funktionieren, wenn du das wegläßt. Ein "Downcast" geht nur, wenn es sich auch tatsächlich um ein Objekt des Typs handelt, auf den du casten möchtest.
-
Na, etwas verwirrt bin ich jetzt schon....
fasse ich kurz zusammen (aber besser Schritt für Schritt;-)):
Subklasse sub, Superklasse super gegeben:
super = sub; //Nach Buch-Beispiel-Kommentar wird ja gecastet.
-> D.h. was sub zusätzlich konnte, das ist jetzt "abgeschnitten". Eigentlich
habe ich ja wieder das gleiche Objekt super, wie zuvor.
-
genau...vice oder veep oder wie es auch hieß verweist am Ende wieder aufdasselbe Objekt wie schon nach der 2. Zeile
-
Ok....
der nächste Schritt ist dann:
sub = (Subklasse) super;
Frage a)
Alleine funktioniert diese Anweisung nicht.
Ich kann aus Frame kein JFrame machen, also nicht irgendwie die zusätzlichen
Funktionalitäten dieser Klasse herzaubern. Richtig?Frage b)
Weil ich aber super eine Referenz auf Subklasse zugewiesen habe, funktioniert das Beispiel. Jetzt frage ich mich nur, warum ich dann noch nach Subklasse
casten muss, wenn doch schon die Referenz auf Subklasse gesetzt wurde?sub = (Subklasse) super;
oder
vice = (VicePresident) emp; //Der emp ist doch schon ein vice nach emp = vice.
//Warum also noch casten?
-
Original erstellt von <Frage>:
**Frage a)
Alleine funktioniert diese Anweisung nicht.
Ich kann aus Frame kein JFrame machen, also nicht irgendwie die zusätzlichen
Funktionalitäten dieser Klasse herzaubern. Richtig?
**Wenn das Frame ursprünglich kein JFrame war, geht das nicht, richtig. Nur wenn das Frame vorher ein JFrame war, also z.B. so:
[java]
JFrame jf = new JFrame();
Frame f = jf;
JFrame jf2 = (JFrame)f;[/code]
Aber dies geht halt nur, weil das Objekt ursprünglich ein JFrame ist.**
Weil ich aber super eine Referenz auf Subklasse zugewiesen habe, funktioniert das Beispiel. Jetzt frage ich mich nur, warum ich dann noch nach Subklasse
casten muss, wenn doch schon die Referenz auf Subklasse gesetzt wurde?
**Das ganze wird erst konkret interessant wenn man z.B. Objekte in einer Liste speichert. Denn die Liste sagt nur, dass Objekte rauskommen, wer da vorher was auch immer reingesteckt hat, ist unklar. Deswegen muss man was aus einer Liste komtm (Typ Object) wieder zu dem casten was es war, den ntheoretisch kannd a jedes beliebige Objekt rauskommen.
-
Auf das Beispiel bezogen:
JFrame jf = new JFrame();
Frame f = jf;
JFrame jf2 = (JFrame)f;a)
D.h. das Frame f ist nach der Zuweisung von
f = jfnoch gar kein JFrame, sondern es steht nur eine Referenz darauf. Quasi ein
Knopf, mit der Aufschrift "hat Möglichkeit zum JFrame zu werden".
Es besitzt auch noch nicht die Möglichkeiten eines JFrames ->der Aufkleber alleine bewirkt noch nichts. Es muss noch der Knopf gedrückt werden, damit es zu einem JFrame wird. Richtig?b)
Noch eine Frage zu Methoden bzw deren Argumenten:
Voraussetzung: Klasse Window window
Subklasse Frame framepublic void method(Window window)
{}Ich kann jetzt wie folgt aufrufen:
method(window);
aber auch:
method(frame); //funktioniert.
Jetzt sieht die Methode so aus:
public void method(Frame frame)
{}Aufruf:
method(frame); //klar
und
method( (Frame) window) //muss gecastet werden.
Ist auch wieder auf das Beispiel im Buch bezogen.
-
denn es heisst: um Objekte einer Superklasse (oben: Window) dort zu verwenden, wo eigentlich Objekte einer Subklasse (oben: Frame) erwartet werden, müssen diese explizit gecastet werden:
->
public void method(Frame frame)
{}Aufruf:
method(frame);
method( (Frame) window); //expliziter Cast notwendig. -> von Super nach Sub.
-
zumindest a) sollte jetzt richtig sein. Ist die Erklärung bzw. Vorstellung mit
dem Knopf auch ok?und b)? Aus den bisherigen Ergebnissen ist es nicht möglich, wenn ich das jetzt recht verstanden habe. (obwohl es laut Buch geht)
-
a)
D.h. das Frame f ist nach der Zuweisung von
f = jfnoch gar kein JFrame, sondern es steht nur eine Referenz darauf. Quasi ein
Knopf, mit der Aufschrift "hat Möglichkeit zum JFrame zu werden".
Es besitzt auch noch nicht die Möglichkeiten eines JFrames ->der Aufkleber alleine bewirkt noch nichts. Es muss noch der Knopf gedrückt werden, damit es zu einem JFrame wird. Richtig?nicht ganz richtig..ich glaubb du hast noch nicht ganz verstanden wie das mit Variablen und den mit "new"-erzeugten Objekten genau zusammen hängt.. ein Objekt ist eigentlich technisch gesehen erst mal nur eine Ansammlung von Daten die irgendwo im Speicher abgelegt werden sobald man new aufruft...mit den Variablen verweist man nun auf diese Objekte, damit man diese ansprechen kann, ansonsten würden sie halt so im Speicher vor sich hin gammeln und keiner könnt was mit anfangen, jetzt muß der Variablentyp nicht vom selben Typ sein wie der Objekttyp..
bei einer Zuweisung mit = ändert sich erstmal gar nix an den Objekten selber sondern nur die Verweise ändern sich..
so.. bei dem Beispiel läuft das dann so ab:
JFrame jf = new JFrame();
Variable vom Typ JFrame mit Namen jf wird angelegt. Objekt vom Typ JFrame wird mit new erzeugt. Der Verweis um welches Objekt es sich handelt wird von new zurückgegeben und in jf gespeichert...beides selber Typ kein Problem..
Frame f = jf;
Variable vom Typ Frame wird erzeugt. Sie soll auf dasselbe Objekt wie jf verweisen (also auf das JFrame-Objet)..Variablentyp f ist von einem Supertyp von Variablentyp jf, daher kein Problem..
JFrame jf2 = (JFrame)f;
Variable vom Typ JFrame wird angelegt....das Objekt auf das jf2 zeigt soll dasselbe sein , auf das auch f zeigt ...so.. jf2 ist vom Variablentyp JFrame, der Variablentyp von f ist Frame, das geht eigentlich nicht, weil sub kann nicht super zugewiesen werden...allerdings das Objekt das f referenziert ist vom Typ JFrame. Das weiß man eben weil man die ersten beiden Zeilen kennt daher kann man jetzt casten...Casten is also immer dann möglich und nötig wenn man weiß , daß sich Variablentyp und Objekttyp vertragen...nicht aber Variablentyp und Variablentyp...
diese Trennung zwischen den Begriffen "Variable" und "Objekt" wie ich sie grad verwendet hab, wird in der Praxis übrigens häufig nicht so verwendet, sie war jetzt hauptsächlich zur Erklärung
hoffe ich hab dich jetzt nich noch mehr verwirrt
[ Dieser Beitrag wurde am 29.04.2003 um 17:50 Uhr von crass editiert. ]
-
ok, hab ich jetzt kapiert....
ich wollte jetzt eigentlich nur noch wissen, ob das mit den Methoden (Argumenten) so hinhaut, wie ich sie als Beispiel gestellt hatte. Kurzum: Funktioniert das Casting so? Ich denke nicht, oder? (Aus den bisherhigen Erkentnissen schliessend)
-
public void method(Frame frame)
{}Aufruf:
method(frame); //klar
und
method( (Frame) window) //muss gecastet werden.
Naja, es kann funtkionieren. Nämlich dann wenn window auf ein Objekt vom Typ Frame zeigt, falls also vor dem Methodenaufruf sowas war:
Window window=new Frame();
dagegen bei
Window window=new Window()
würde es nicht gehen
(compilieren ließe es sich, aber eben Laufzeitfehler (Exception))[ Dieser Beitrag wurde am 29.04.2003 um 18:12 Uhr von crass editiert. ]
-
Ei, ei, ei....das steht jetzt aber wirklich nicht im Buch.
Ich glaub, ich beschwere mich mal....
-
Folgender Code:
interface Foo {} class Alpha implements Foo { } class Beta extends Alpha {} class Delta extends Beta { public static void main( String[] args) { Beta x = new Beta(); // insert code here } }
Wieso entsteht eine ClassCastException bei:
Foo f= (Delta)x;Wenn ich
Delta f2 = (Delta)x;
oder
Alpha f3 = (Alpha)x;
einsetzen würde gibt es auch eine Exception.
Warum?
-
weil x eben kein Delta ist.
-
Erzhorst schrieb:
weil x eben kein Delta ist.
Stimmt, denn x ist ein Beta, welches Alpha erweitert und Alpha implementiert Foo.
x hat mit Delat nix zu tun, daher die ClassCastException.