我对Java中的方法重写和重载如何工作有基本的了解。但是我的问题是,为什么编译器会根据参数的编译类型搜索最具体的方法?换句话说,为什么在方法重载的情况下,它基于引用类型而不是对象类型进行搜索?

检查下面的例子

class Base { }

class Derived extends Base { }

class Test {

    void foo(Base thing) { System.out.println("foo(Base)"); }
    void foo(Derived thing) { System.out.println("foo(Derived)"); }

    public static void main(String[] args) {
        Test tester = new Test();
        Base base = new Base();
        tester.foo(base);// 1st call
        base = new Derived();
        tester.foo(base); // 2nd call
        tester.foo(new Derived()); // 3rd call
    }
}


实际产量

1st call: foo(Base)

2nd call: foo(Base)

3rd call: foo(Derived)


我期望的输出

1st call: foo(Base)

2nd call: foo(Derived)

3rd call: foo(Derived)

最佳答案

1)重载发生在编译时,即要使用哪种方法定义
在编译时决定执行。
2)您正在将派生类对象引用分配给基类
对象在运行时。
3)因此在编译时显然不知道引用您的
基类对象将在将来(即在运行时)具有。
4)这就是为什么编译器会在其中查看引用类型的原因
方法重载的情况

09-30 17:17
查看更多