Java中方法重写仅适用于非private、非static、非final的实例方法;private方法因不可见而无法重写,static方法属类级别只能隐藏,final方法被编译器禁止重写。

Java 中方法重写(override)只适用于非私有的实例方法。私有方法、静态方法和 final 方法都因各自机制限制,无法被子类真正重写。
私有方法无法重写,因为根本不可见
private 方法在编译期就被限定在声明它的类内部,子类既看不到,也无法继承。即使子类定义了同名、同参数的方法,那也只是新增的一个独立方法,与父类无关。
- 不是重写,也不是重载——它不参与继承链,也不受 @Override 注解约束
- 父类 private 方法对子类完全不可访问,自然谈不上覆盖行为
- 这种“同名方法”在字节码中是两个完全独立的符号,调用时也互不影响
静态方法不能重写,只能被隐藏
static 方法属于类,不属于对象,调用依赖于引用的编译时类型,而非运行时实际类型,因此不支持多态,也就没有重写的语义。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 子类定义同名 static 方法,称为“隐藏(hiding)”,不是重写
- Base b = new Sub(); b.method() 调用的是 Base 的 static 方法
- Sub s = new Sub(); s.method() 才调用 Sub 的 static 方法
- 即便加 @Override,编译器也会报错:“method does not override or implement a method”
final 方法明确禁止重写,编译期直接拦截
final 方法允许被继承和调用,但一旦声明为 final,子类任何试图提供同签名实现的行为都会在编译阶段失败。
立即学习“Java免费学习笔记(深入)”;
- 子类中写一个与父类 final 方法签名完全一致的方法,会触发 “Cannot override the final method” 错误
- 这个限制是 JVM 字节码层面的:ACC_FINAL 标志让虚拟机拒绝覆盖操作
- @Override 注解在此处无效,甚至可能引发额外编译警告
- final 不影响重载(overload),只阻止重写(override)
这三类方法从设计上就排除了动态绑定的可能:私有方法走静态绑定且不可见;静态方法走静态绑定但按引用类型分派;final 实例方法虽走动态绑定,但被强制锁定实现。它们共同划清了 Java 多态的边界。

















