Java中父类用final修饰的方法不能被子类重写,否则编译器直接报错;这是语言强制约束,用于防止行为被修改,常见于工具类关键方法,如String的length()。

Java 中父类用 final 修饰的方法**不能被子类重写**,否则编译器会直接报错,不会等到运行时。
为什么 final 方法不能重写
final 关键字在方法上表示“不可覆盖”,这是 Java 语言的强制约束。设计者用它来防止子类改变该方法的行为,常用于工具类(如 java.lang.String 中的 length()、charAt() 等方法)或关键逻辑保护。
典型编译错误信息
当你在子类中尝试重写父类的 final 方法时,例如:
class Parent {
final void show() {
System.out.println("parent");
}
}
class Child extends Parent {
@Override // 或直接写 void show()
void show() { // ← 编译器在此行报错
System.out.println("child");
}
}
编译时会提示类似:
立即学习“Java免费学习笔记(深入)”;
- error: method show() in class Parent cannot be overridden
- 或中文环境:错误: 父类中的 final 方法 show() 无法被重写
常见误操作与澄清
- 加 @Override 注解会立刻触发编译错误;不加注解也会报错,只是提示可能稍隐晦
- 子类可以调用父类的 final 方法(如 super.show()),但不能修改其实现
- final 方法可以被重载(overload)——即在子类中定义同名但参数不同的方法,这完全合法
- 如果父类方法不是 final,但子类方法加了 final,这没问题;反过来(父类 final → 子类试图覆盖)才非法
如何修复这类错误
- 确认是否真需要修改该行为:如果业务逻辑必须变更,应检查设计——是否该方法本就不该设为 final?能否通过组合、策略模式替代继承?
- 若只是想扩展功能,可考虑在子类中新增一个非 final 方法,内部调用 super.show() 再补充逻辑
- 若父类是你自己维护的,且确定子类需要定制,就移除父类方法的 final 修饰符(注意兼容性和语义合理性)


















