考虑以下代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
public class B extends A {
public B(int n) {
super(n);
}
public boolean f(B b) {
return getNum() == b.getNum();
}
}
Run Code Online (Sandbox Code Playgroud)
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));
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白的是为什么这个方法f是为类运行A(并且打印为false)而不是B,因为在运行时y1是因为类型B,并且应该归结为f类中的方法B?
在运行时y1的类型是B类型,应该转到B类中的方法f?
没有:
B.f()不会覆盖, A.f()因为参数类型不同.它超载了它.如果更改B.f()为接受类型的参数A而不是B,则会看到它被执行.这并不取决于执行时类型参数,但在执行时类型目标的呼叫.
选择的方法实现决不依赖于参数的执行时类型.