Java中重载方法的类型顺序

Java中重载方法的类型顺序,java,types,Java,Types,给定Java中同一类上的两个方法: public void doSomething( Person person ); public void doSomething( Employee employee ); 在哪里 如果我打电话: doSomething( employee ) 我发现doSomething(Person)被调用 我希望调用最接近匹配契约的重载,而不是最抽象的重载(这就是我所发现的) 有人能解释一下原因吗?员工是如何申报的?如果声明为Person employee=new

给定Java中同一类上的两个方法:

public void doSomething( Person person );
public void doSomething( Employee employee );
在哪里

如果我打电话:

doSomething( employee )
我发现
doSomething(Person)
被调用

我希望调用最接近匹配契约的重载,而不是最抽象的重载(这就是我所发现的)


有人能解释一下原因吗?

员工是如何申报的?如果声明为
Person employee=new employee()
,那么
doSomething(Person)
确实是最接近的匹配重载

与重写不同,重载是在编译时确定的。因此,即使
employee
的运行时类型是
employee
,也已经选择执行
Person
重载

见:

调用方法时,在编译时使用实际参数(以及任何显式类型参数)的数量和参数的编译时类型来确定将调用的方法的签名。如果要调用的方法是实例方法,则将在运行时使用动态方法查找确定要调用的实际方法


使用了最具体的适用重载—但该重载是在编译时根据
employee
变量的编译时类型确定的

换言之:

Employee employee = new Employee();
doSomething(employee); // Calls doSomething(Employee)
但是:


请注意,这与重写不同,在重写中,重要的是目标对象的执行时间类型。

在调用重载时,将调用具有最接近匹配签名的方法。我怀疑您的
员工
是一个
变量。因此,在方法调用时,
employee
的引用类型会导致选择
doSomething(Person)

方法选择是在编译时而不是运行时完成的,因此如果

Person employee = new Employee();
doSomething(employee);

这将称为doSomething(Person),因为声明的类型是Person,而不管该实例是否也是一名员工。

小子,你的敏捷Jon,今天你第二次告诉我答案:)不公平,我打败了你们两个(尽管我必须承认我的第一个版本没有太大帮助)Jon回答问题的方式就像阅读参考手册——完整、简洁、切中要害。伙计,这家伙让我很生气。:)
Person employee = new Employee();
doSomething(employee); // Calls doSomething(Person)
Person employee = new Employee();
doSomething(employee);