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