Java继承场景下重载方法的调用判定问题
Java重载方法调用的问题解答
嘿,这个问题刚好戳中了Java重载方法绑定的核心点,我来给你讲明白~
首先得明确一个关键规则:Java的重载方法是在编译阶段确定调用目标的,这和重写(运行时动态绑定)完全不同。重载匹配的核心依据是调用时传入参数的编译时类型,而不是对象的实际运行时类型。
回到你的代码场景:
- 你的
Person类里有两个重载的getWorkDetail方法:getWorkDetail(Employee e):参数类型为Employee(显然是Person的子类,虽然你没贴这个类的代码)getWorkDetail(Person p):参数类型为Person
- 在
work方法里,你调用的是getWorkDetail(this)——这里的this在Person类的方法中,它的编译时类型就是Person
编译器会在编译阶段寻找最匹配的重载方法:因为this的编译类型是Person,和第二个方法的参数类型完全匹配,所以最终会调用getWorkDetail(Person p),也就是输出 This person is not an Employee 的那个版本。
哪怕后续你创建了Employee子类继承Person,并且用Person p = new Employee(...)这种多态方式创建对象,调用p.work()时依然会触发同一个重载方法。因为work方法是定义在Person类中的,编译时就已经确定了getWorkDetail的调用目标,和运行时对象是不是Employee没有关系。
举个补充代码的例子更直观:
// 假设Employee类是这样的 public class Employee extends Person { public Employee(String name, int birth, String sex) { super(name, birth, sex); } } // 测试代码 public class Test { public static void main(String[] args) { Person person = new Employee("Bob", 1985, "Male"); person.work(); // 输出:This person is not an Employee } }
内容的提问来源于stack exchange,提问作者Eric S
相关产品推荐
相关产品推荐

