我对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)这就是为什么编译器会在其中查看引用类型的原因
方法重载的情况