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
相关产品推荐
相关产品推荐

