Ich habe eine Frage zu der Ausgabe des folgenden Programms:
public class A {
int x = 1;
static double y = 3.0;
public A() {
x = (int) y;
}
public A(int x) {
this.x = this.getX() + x;
}
int getX() {
return this.x;
}
public void f(float z) {
y *= z;
}
}
public class B extends A {
int x = 7;
public B(int x) {
super(x);
this.x = x;
}
public B() {
this.y += 1.0;
}
int getX() {
return this.x;
}
public void f(long z) {
y += z;
}
public void f(double z) {
y -= z;
}
}
Wenn ich in der main-Methode
A ab = new B(5);
System.out.println(ab.x + " " + A.y);
ausgebe, wird 5 und 3.0 zurückgegeben. 3.0 kann ich nachvollziehen, an der statischen Variable y ändert sich ja nichts.
5 wiederum verstehe ich nicht:
Als erstes wird der Konstruktor mit dem übergebenen Parameter 5 (int x) der Oberklasse A durch das implizite super() im Konstruktor mit (int x) der Klasse B aufgerufen.
In diesem wird this.x (hier:1) auf this.getX() + x gesetzt. Ich habe herausgefunden, dass um den Wert von this.getX() zu bekommen, die getX() Methode der Klasse B ausgeführt wird. Warum nicht die der Klasse A?
In der getX() Methode der Klasse B steht die Anweisung return this.x;
Damit nachher im Konstruktor der Klasse A this.x=this.getX() + x dann 5 ergibt (Ausgabe von ab.x), muss this.x in der getX() Methode der Klasse B 0 gewesen sein.. Wieso 0? Ich dachte 7?
Ich hoffe ich habe meine Unklarheiten einigermaßen verständlich erklärt und mir kann jemand helfen.
Danke!
public class A {
int x = 1;
static double y = 3.0;
public A() {
x = (int) y;
}
public A(int x) {
this.x = this.getX() + x;
}
int getX() {
return this.x;
}
public void f(float z) {
y *= z;
}
}
public class B extends A {
int x = 7;
public B(int x) {
super(x);
this.x = x;
}
public B() {
this.y += 1.0;
}
int getX() {
return this.x;
}
public void f(long z) {
y += z;
}
public void f(double z) {
y -= z;
}
}
Wenn ich in der main-Methode
A ab = new B(5);
System.out.println(ab.x + " " + A.y);
ausgebe, wird 5 und 3.0 zurückgegeben. 3.0 kann ich nachvollziehen, an der statischen Variable y ändert sich ja nichts.
5 wiederum verstehe ich nicht:
Als erstes wird der Konstruktor mit dem übergebenen Parameter 5 (int x) der Oberklasse A durch das implizite super() im Konstruktor mit (int x) der Klasse B aufgerufen.
In diesem wird this.x (hier:1) auf this.getX() + x gesetzt. Ich habe herausgefunden, dass um den Wert von this.getX() zu bekommen, die getX() Methode der Klasse B ausgeführt wird. Warum nicht die der Klasse A?
In der getX() Methode der Klasse B steht die Anweisung return this.x;
Damit nachher im Konstruktor der Klasse A this.x=this.getX() + x dann 5 ergibt (Ausgabe von ab.x), muss this.x in der getX() Methode der Klasse B 0 gewesen sein.. Wieso 0? Ich dachte 7?
Ich hoffe ich habe meine Unklarheiten einigermaßen verständlich erklärt und mir kann jemand helfen.
Danke!