java 中父类引用调用静态方法时,采用的是编译期绑定(静态绑定),实际执行的是引用变量声明类型的方法,而非运行时对象所属类的方法。这意味着多态机制对静态方法无效,编译器在编译阶段就会根据引用的类型确定调用的具体方法。

Parent 引用指向 Child 实例时,调用 staticMethod() 会执行哪个类的版本?
会执行 Parent 类中的版本。因为静态方法是属于类的,而不是属于对象的,JVM 在编译时就已经确定了要调用的方法签名,完全忽略运行时的实际对象类型。

public class Parent {
public static void staticMethod() {
System.out.println("Parent static method");
}
}
public class Child extends Parent {
public static void staticMethod() {
System.out.println("Child static method");
}
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
p.staticMethod(); // 输出: Parent static method
}
}为什么静态方法不支持多态而实例方法支持?
因为静态方法在类加载时就已确定,没有虚方法表(vtable)参与调度,而实例方法通过动态分派实现多态。静态方法的调用指令是 invokestatic,直接指向类元数据;实例方法使用 invokevirtual,根据对象头查找实际类型的方法地址。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
立即学习“Java免费学习笔记(深入)”;

public class Parent {
public static void staticMethod() {
System.out.println("Parent static method");
}
public void instanceMethod() {
System.out.println("Parent instance method");
}
}
public class Child extends Parent {
public static void staticMethod() {
System.out.println("Child static method");
}
@Override
public void instanceMethod() {
System.out.println("Child instance method");
}
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
p.staticMethod(); // 输出: Parent static method
p.instanceMethod(); // 输出: Child instance method
}
}当子类隐藏父类静态方法时,如何通过子类引用调用子类的版本?
直接使用子类类型的引用调用即可。例如将引用声明为 Child 类型,或强制转换后调用,这样编译器会绑定到 Child 类的静态方法。

















