多态性java思维

Yuv*_*evy 4 java polymorphism

考虑以下代码:

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

Jon*_*eet 8

在运行时y1的类型是B类型,应该转到B类中的方法f?

没有:

  • B.f()不会覆盖, A.f()因为参数类型不同.它超载了它.
  • 在编译时挑选重载,而不是在执行时挑选

如果更改B.f()为接受类型的参数A而不是B,则会看到它被执行.这并不取决于执行时类型参数,但在执行时类型目标的呼叫.

选择的方法实现决不依赖于参数的执行时类型.