0
に継承されたクラスのオブジェクトを割り当てるIはAとB Bが指す のインスタンスzが存在するクラスMの主な方法で今Aからスーパークラスオブジェクト
を継承二つの与えられたクラスを有しますB.
継承されたクラスのオブジェクトがスーパークラスに割り当てられている場合、サブクラスのメソッドは保持されています。
質問:なぜz.(-6)
のために、のf(double y)
が使用されていますか? つまり、出力が-8.0と4.0を与える理由を説明できますか?あなたの例では
public class A {
public int x = 2;
public A() {
this.x+++;
}
public A(int x) {
this.x += x;
}
public void f(double x) {
this.x = (int) (x + B.y);
}
}
public class B extends A {
public static double y = 3;
public double x = 0;
public B(double x) {
y++;
}
public void f(int y) {
this.x = y * 2;
B.y = 0;
}
public void f(double y) {
this.x = 2 * y + B.y;
}
}
public class M {
public static void main(String[] args) {
A a = new A((int) B.y);
System.out.println(a.x); // OUT: [5]
B b = new B(2);
System.out.println(b.x + " " + B.y); // OUT: [0.0] [4.0]
A z = b;
System.out.println(z.x); // OUT: [3]
z.f(-0.5);
System.out.println(b.x + " " + z.x); // OUT: [-6.0] [3]
z.f(-6);
System.out.println(b.x + " " + B.y); // OUT: [-8.0] [4.0]
}
}
をランタイムx) 'である。また、意味のある変数名とメソッド名を使用してください。 –
'z'の静的型は' f(int) 'を持たない' A'であるため、コンパイル時のメソッド解決は 'f(double)'を選択し、実行時に動的ディスパッチはオーバーライドされたバージョン'B'クラスのそのメソッドの。 –