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.
Ich habe folgenden Programmcode, und soll die Ausgabe bestimmen. Dabei bereiten mir die letzten zwei Ausgaben schwierigkeiten und ich hoffe ihr könnt mir dabei helfen.
Bis jetzt bin ich davon Ausgegangen das als A z = b zugewiesen wurde, z auch die Methode f von B übernimmt, da diese Überschrieben wird. Allerdings kann ich mir nicht erklären wieso b.x verändert wird und nicht z.x. Wieso kennt z.x die Variable x aus B überhaupt
Die letzten beiden Ausgaben sind
vorletzte Ausgabe_Out: -2 4 und eben nicht 4 -2.
letzte Ausgabe_Out: -3 4 und eben nicht 4 -3.. Ich kanns mir nicht erklären... Vielen Dank !
Java:
public class A {
public int x = 1;
public A(int x) {
this.x += x;
}
public A(double x) {
x += x;
}
public void f(double x) {
this.x = this.x + (int)(x + B.y);
}
}
public class B extends A {
public static int y = 3;
public int x = 0;
public B(double x) {
super((int) x);
}
public void f(int y) {
this.x = y * 2;
B.y = this.x;
}
public void f(double y) {
this.x = (int) y + B.y;
}
public void tss() {
System.out.println("JApop");
}
}
public class M {
public static void main(String[] args) {
A a = new A(B.y);
System.out.println(a.x);
a.f(1);
System.out.println(a.x);
B b = new B(3.0);
System.out.println(b.x);
A z = b;
System.out.println(z.x);
z.f(-5.0);
System.out.println(b.x + " " + z.x);
z.f(-6);
System.out.println(b.x + " " + z.x);
}
}
Ach immer diese vollkommen unnötigen Aufgaben, aber ok. Letzter Aufruf "z.f(-6)". Zunächst ist für den Compiler die Variable z vom Typ A und sucht deshalb die passende Methode in der Klasse A. Da es keine Methode mit int als Parameter gibt, wählt er die mit double. Ein int passt ja noch so halbwegs in ein double. Nun greift zur Laufzeit die Polymorphie und die Methode mit der GLEICHEN SIGNATUR wird aufgerufen. Also die mit double nicht mit int.
Danke Kevin für deinen Betrag.
Ich hab jetzt zwar verstanden das die Funktion f mit dem Parameter double nimmt, aber die ist ja mit der Methode von B überschrieben... Ich verstehe jetzt einfach nicht weshalb die Variable x aus B verändert wird und nicht die Variable x aus A.. z ist ja schließlich ein Objekt aus A und nicht aus B.
Nein ist es nicht. Für den Compiler ist die Variable z vom Typ A. Aber zur Laufzeit steht in der Variablen z eine Referenz zu dem Objekt, das mit "new B(3.0)" erstellt wurde, also eins von Typ B.