Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo Forum,
wir sind ein paar Onlinemedien Studenten und lernen gerade für eine Java Klausur. Leider kommen wir nun nicht mehr weiter weil wir ein Problem haben was wir und nicht erklären können.
Wir haben das Problem auf ein Minimum reduziert:
Folgender Code:
Code:
public class A {
public void m() {
System.out.println("A.m");
}
}
Code:
public class B extends A {
public void m() {
System.out.println("B.m");
}
}
Code:
public class tester {
public static void main(String[] args) {
B test = new B();
test.m();
A x = (A)test; // -DA-
x.m();
}
}
An der Stelle "DA" casten wir ja von B auf A, also ein UpCast. Unserer Meinung nach, müsste nun die "m"-Methode des Vaters ausgeführt werden, aber stattdessen wird die Methode des Sohnes ausgeführt und es kommt zwei mal zur Ausgabe von "B.m" anstatt von "B.m" und danach zur Ausgabe von "A.m".
Ich hoffe das ist für euch verständlich genug formuliert und ihr könnt uns helfen..
Vielen Dank im Voraus
Ein paar verzweifelte Studenten mit Informatikprüfung am Montag..
Beim casten wird nur die Sichtbarkeit verändert, du kannst damit nicht aus einer Klasse B wieder eine Klasse A machen. Deine Instanz B ist immer noch eine Klasse B die von A erbt. Nur sind jetzt eben nur die Methoden der Oberklasse A sichtbar.
Wenn du die ursprüngliche Methode m aus der Oberklasse A haben willst mußt du in der Unterklasse super.m() aufrufen.
Ein Cast ist schall und Rauch. Bei einem Cast wird dem Compiler lediglich 'versprochen' mein Objekt A ist mit Sicherheit auch vom Typ B. Dabei wird nichts verändert.
Ein Cast auf eine Superklasse hat überhaupt keinen Effekt (mit einer Ausnahme bei überladenen Methoden), weil man ihn auch einfach weg lassen kann.
B ist immer auch vom Typ A.
Zum Cast-Problem: das ist die Problematik der statischen vs. dynamischen Bindung. In Java wird hier dynamische Bindung verwendet. siehe hier
Überladen: zwei Methoden mit gleichem Namen, aber anderen Argumenten (z.B. "print( int )" vs. "print( String )" ).
Überschreiben: eine Methode welche eine andere Methode ersetzt.
Gehen wir mal in die Java 1.4 Zeit zurück ohne generics. Wenn du eine dynamische Liste, wie eine Arraylist hattest, hat die get Methode folgende Signatur:
Code:
public Object get(int index);
Damit kompilierter folgender Code nicht:
Code:
MyA a = new MyA();
liste.add(a);
a = liste.get(0);
Denn liste.get liefert ein Objekt vom Typ Object zurück. Und das lässt dich der Compiler nicht einem Objekt vom Typ MyA zuweisen. Du weißt, dass das zurückgelieferte Objekt aber in Wirklichkeit ein MyA ist, also musstest du folgendes schreiben:
Code:
MyA a = new MyA();
liste.add(a);
a = (MyA)liste.get(0);