能,但只是“可见”而非真正继承;子类不重写时调用父类静态方法,重写实为隐藏,由引用类型决定调用目标,不支持多态和重写。
静态方法能被继承吗?
能,但只是“可见”,不是真正意义上的继承。子类编译后字节码里不会新增静态方法的副本,而是通过符号引用指向父类的 static 方法;调用时由编译期决定目标方法(早期绑定),和对象实例无关。
这意味着:Parent.staticMethod() 和 Child.staticMethod() 看似一样,实际调用的都是父类定义的那个方法——除非子类自己也声明了一个同签名的静态方法。
- 子类不写同名静态方法:调用
Child.staticMethod()会静默转发到父类实现 - 子类写了同名静态方法:这不是重写(override),是隐藏(hiding)——两个方法各自独立存在,调用哪个取决于**引用类型**,而非运行时对象类型
- IDE 或编译器通常会警告 “Static method should be accessed in a static way”,提醒你别用实例调用静态方法
为什么静态方法不能被重写?
因为重写(override)依赖虚方法表(vtable)和运行时动态分派,而静态方法在编译期就绑定了目标字节码指令(invokestatic),压根不进 vtable,JVM 也不查对象的实际类型。
如果你试图在子类中“重写”一个静态方法:
立即学习“Java免费学习笔记(深入)”;