静态方法是非虚方法,编译期绑定,只依据声明类型调用,不支持动态绑定与多态;其调用由invokestatic指令完成,不依赖this指针和vtable。

Java 中静态方法不支持虚函数特性。
静态方法是编译期绑定的非虚方法
Java 虚函数的核心是动态绑定(运行时根据对象实际类型决定调用哪个版本),而静态方法在编译阶段就确定了调用目标——它只看引用的声明类型,完全忽略实际对象类型。例如:
- Parent p = new Child(); p.display(); 调用的是 Parent.display(),哪怕 Child 也定义了同名静态方法;
- 即使把 p 设为 null,p.staticMethod() 仍能通过编译并正常执行(等价于 Parent.staticMethod());
- JVM 使用 invokestatic 指令调用静态方法,该指令在类加载解析阶段就锁定目标方法,不查虚方法表(vtable)。
静态方法无法被真正重写(Overriding)
子类中声明同名静态方法,本质上是“隐藏”(hiding),而非多态意义上的重写:
- 父类和子类的静态方法各自独立存在,互不影响;
- 没有运行时分派机制,不存在“父类引用指向子类对象时自动调用子类实现”这一行为;
- IDE 常提示“不要通过实例调用静态方法”,正是因为这种写法容易误导,让人误以为有动态绑定。
虚函数存在的前提不适用于静态方法
虚函数依赖三个关键要素:对象实例、this 引用、虚方法表(vtable)。而静态方法:
立即学习“Java免费学习笔记(深入)”;
- 不依赖任何对象实例,也不持有 this;
- 属于类本身,在类加载时就已定位到具体字节码位置;
- 不参与继承链上的动态分派,因此不具备多态能力。
Java 中哪些方法是非虚的?静态方法是典型之一
除静态方法外,以下也属于非虚方法(编译期绑定):
- private 方法(受限访问,无法被继承);
- final 方法(禁止重写);
- 构造器(<init>,使用 invokespecial);
- 父类私有或被 final 修饰的方法(子类不可见或不可覆盖)。
其余普通实例方法(未被上述修饰符限制)默认都是虚方法,由 invokevirtual 指令驱动,支持运行时多态。


















