我有两个给定的A和B类。 B继承自A.
现在在M类的主要方法中有一个A的实例z 这指向B的对象。
我知道如果将继承类的对象分配给超类,则子类的方法会保留。
问题:为什么z.(-6)
使用了B的方法f(double y)
而不是f(int 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]
}
}
答案 0 :(得分:1)
在您的示例中,z
是引用而不是对象。 z
实际上指向B
实例,无论编译器是否知道它。
那么为什么z。( - 6)使用B的方法f(double y)而不是f(int y)?
您已告诉编译器z
是对A
的引用,并且只有一个方法f(double)
可以被覆盖但不会被子类重载。
即。调用方法的签名是在编译时确定的(编译器的类型),而不是运行时(不是实际类型)