You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java继承场景下重载方法的调用判定问题

Java重载方法调用的问题解答

嘿,这个问题刚好戳中了Java重载方法绑定的核心点,我来给你讲明白~

首先得明确一个关键规则:Java的重载方法是在编译阶段确定调用目标的,这和重写(运行时动态绑定)完全不同。重载匹配的核心依据是调用时传入参数的编译时类型,而不是对象的实际运行时类型。

回到你的代码场景:

  1. 你的Person类里有两个重载的getWorkDetail方法:
    • getWorkDetail(Employee e):参数类型为Employee(显然是Person的子类,虽然你没贴这个类的代码)
    • getWorkDetail(Person p):参数类型为Person
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 07:04:07