考虑以下代码:
public class A{
private int num;
public A(int n){
num = n;
}
public int getNum(){
return num;
}
public boolean f(A a){
return num == a.num * 2;
}
}
public class B extends A {
public B(int n) {
super(n);
}
public boolean f(B b) {
return getNum() == b.getNum();
}
}
public class Main
{
public static void main(String[] args){
A y1 = new B(10);
B y2 = new B(10);
System.out.println("y1.f(y2) is: "+y1.f(y2));
}
}
我不明白为什么方法f
正在为类A
(并且打印为false)而不是B
运行,原因是在运行时{{1} }属于y1
类型,应该转到类B
中的方法f
吗?
答案 0 :(得分:8)
因为在运行时y1是B类型,应该转到B类中的方法f?
没有
B.f()
没有覆盖 A.f()
,因为参数类型不同。它超载了它。如果您更改B.f()
以接受A
类型的参数而不是B
,则您会看到它被执行。这并不取决于参数的执行时类型,而是取决于调用的目标的执行时类型。
选择 never 的方法实现取决于参数的执行时类型。
答案 1 :(得分:1)
注意B类和B类的参数。 f函数中的A类是不同的。这就是"重力低的原因"这里不存在,这次它进入A.f函数