覆盖方法和奇怪的行为

Overriding methods and weird behavior

我有 2 个 class,其中一个扩展了第二个并覆盖了父类的一些方法。当我调用 fs.m(ff) 时,我得到了一个奇怪的结果,我不明白为什么会这样。 type First fs 不应该访问 class Second 方法,即使我们为它们分配了一个新的 Second 对象,除非我们像那样转换它 - (Second) fs.m(ff)。谁能解释一下为什么这段代码会产生输出 "override"?

public class Main {

    public static void main(String[] args) {
        First ff = new First();
        First fs = new Second();
        Second ss = new Second();

        System.out.println( fs.m(ff));
    }
}


public class First {
    public String m(First x){
        return "default";
    }

    public String m(First x, First y){
        return "default";
    }
}

public class Second extends First{
    public String m(Second x){
        return "overload";
    }

    public String m(First x){
        return "override";
    }

    public String m(First x, Second y){
        return "???";
    }
}

fs.m(ff)调用的方法由fs的运行时间类型决定。该 运行 时间类型是 Second,并且由于 Second 覆盖了 public String m(First x) 方法,因此该方法被执行。

fs 可以访问在 First class 中声明的方法,因为它是 First 类型,但在 运行 时间内,实际执行的方法取决于这些方法是否被分配给 fs 的实例的 运行 时间类型覆盖,即 Second.

Fs实际上是指向一个Second Object(fs是对Second类型对象的引用)。 因此,当您调用 fs.m(ff) 时,由于动态绑定(覆盖),它实际上是在 Second 上调用对象。