在Java中使用重载方法键入顺序

Mar*_*itt 6 java types

给出了Java中同一个类的两个方法:

public void doSomething( Person person );
public void doSomething( Employee employee );
Run Code Online (Sandbox Code Playgroud)

哪里

Employee extends Person
Run Code Online (Sandbox Code Playgroud)

如果我打电话:

doSomething( employee )
Run Code Online (Sandbox Code Playgroud)

我发现它doSomething( Person )被调用了.

我原本期望调用最接近的匹配合约的重载,而不是最抽象的(这是我发现的)

有人能解释为什么吗?

Jon*_*eet 13

最具体的适用超载使用-但是,过载确定在编译 -time,基于所述的编译时间类型employee变量.

换一种说法:

Employee employee = new Employee();
doSomething(employee); // Calls doSomething(Employee)
Run Code Online (Sandbox Code Playgroud)

但:

Person employee = new Employee();
doSomething(employee); // Calls doSomething(Person)
Run Code Online (Sandbox Code Playgroud)

请注意,这与覆盖目标对象的执行时间类型(重要)不同.