方法重写是强制契约:抽象类中必须重写所有抽象方法才能实例化,接口中必须实现所有抽象方法;@override注解用于编译期校验签名一致性、协变返回、访问权限等规则,防止伪重写。

方法重写(Override)在抽象类和接口中不是“可选操作”,而是设计契约的核心环节——它直接决定子类是否合法、能否实例化、行为是否符合预期。关键不在“怎么写语法”,而在“为什么必须重写”以及“重写时不能踩哪些坑”。
抽象类中重写的本质:补全模板的强制动作
抽象类定义的是一个半成品模板,其中抽象方法是待填空的“必答题”。重写不是为了扩展,而是为了交卷。
- 子类继承抽象类后,如果它不是抽象类,就必须重写父类中所有抽象方法;漏掉任何一个,编译直接报错
- 重写时方法签名(名称、参数列表、返回类型)必须严格一致;访问修饰符不能比父类更严格(比如父类是protected,子类不能用private)
- 抽象类中的具体方法(如eat()、sleep())可以被重写,但不是强制的;重写是为了定制逻辑,不重写就直接复用
- 构造方法不能被重写(它不属于继承链上的行为),但子类构造器中会隐式或显式调用父类构造器来初始化共享字段
接口中重写的规则:兑现能力承诺的唯一方式
实现接口,等于签了一份“能力合同”。重写接口方法,就是履行合同条款——没有商量余地。
- 类用implements实现接口时,必须重写接口中所有public abstract方法(Java 8 之前全部是这种)
- Java 8+ 接口中允许default方法(有实现),这类方法可重写,也可不重写;重写是为了覆盖默认行为
- 接口中的static方法不能被重写(属于接口自身,不参与继承),试图重写会编译失败
- 若一个类同时实现多个接口,且它们有同名同参的default方法,该类必须显式重写这个方法,否则编译报错(解决冲突)
常见误用与规避要点
很多运行时异常或逻辑错误,其实源于重写阶段的疏忽,而非语法错误。
- 把抽象方法误写成private或final——这会导致子类无法重写,编译失败;抽象方法只能是public或protected
- 接口方法被实现类声明为private或static——违反重写规则,编译不通过
- 重写抽象方法时返回类型不协变(如父类返回Animal,子类想返回Dog)——Java 支持协变返回类型,但必须是子类型,否则报错
- 以为实现了接口就能跑通,却忘了接口里新增了抽象方法(比如升级 SDK 后接口加了新方法)——老实现类会立即编译失败,提醒你补全契约
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











