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

Java继承中静态方法查找机制:程序如何识别父类的message()方法?

代码示例
class Human {
    private String name;
    private int age;
    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public static void message() {
        System.out.println("I'm a human.");
    }
}
public class Child extends Human {
    public Child(String name, int age) {
        super(name, age);
    }

    public static void main(String[] args) {
        Child child = new Child("Billy", 3);
        child.message(); // 原注释有误,实际会打印"I'm a human."
    }
}
程序定位到Human类static方法message()的详细过程
  • 编译期先梳理继承关系并收集可访问成员
    编译器处理Child extends Human这行代码时,会先读取解析Human类的定义,把Human中所有可被子类访问的成员(这里message()是public static,属于可访问范围)记录到Child类的继承信息清单里。相当于给Child做了一份包含自身和父类可用成员的“目录”。

  • 调用方法时的逐层查找逻辑
    当编译到child.message()时,编译器首先检查Child类自身有没有定义message()静态方法——这里显然没有。于是它会沿着继承链向上查找,先查直接父类Human,很快就匹配到Human中的message()方法。这里要注意:虽然代码用实例对象child调用,但Java中静态方法本质属于类,编译器会自动把这个调用转换为Human.message(),只是允许用实例的写法而已。

  • 运行时类加载的验证确认
    程序运行时,类加载器会优先加载父类Human(因为Child继承它,父类必须先完成加载),加载过程中会验证Human类的结构,确认message()静态方法存在且访问权限合法。执行到调用代码时,JVM直接调用Human类的message()方法,和child这个实例没有关联。

另外补充:原代码中的注释标注“prints i'm a child.”是错误的,因为Child没有定义自己的message()静态方法(静态方法不存在真正的重写,仅能被同名方法隐藏),所以实际运行会打印I'm a human.。

内容的提问来源于stack exchange,提问作者NinaJava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:22:23