扩展类的重载方法

Jon*_*han 16 java

简单的问题,奇怪的结果.我有两个类AB:

public class A
{
    protected int num;

    public A(int n)
    {
        num = n;
    }

    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 num == b.num;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么要y1.f(y2)调用f()方法A而不是in B

A y1 = new B(10);
B y2 = new B(10);

System.out.println(y1.f(y2));
Run Code Online (Sandbox Code Playgroud)

难道不应该叫f()BB比更具体A

Jon*_*eet 32

为什么y1.f(y2)在A中而不是在B中调用f()方法?

因为编译时类型y1A.

重载是在编译时执行的...您调用方法的对象的执行时类型仅与重写相关.

所以编译器选择的方法f(A)f它知道它可以调用的唯一方法y1(并且在给定参数列表的情况下检查它是否适用).该方法未被覆盖B,因此在执行时,A调用inlmenetation .

作为一个更为明显的例子,请考虑以下代码:

Object x = "foo";
int length = x.length();
Run Code Online (Sandbox Code Playgroud)

这甚至不会编译,因为Object不包含length()方法.String确实,但是编译器不考虑,因为编译时类型xObject,不是String-尽管我们可以告诉大家,在执行时,值x将是一个参考String对象.