方法重写是子类改变父类方法行为的核心手段,需满足四条件:方法签名完全一致、返回值相同或更具体、访问权限不更严格、异常声明不扩大;private、static、final方法不可重写;推荐使用@Override注解校验并显式调用super.方法名()复用父类逻辑。

子类继承父类后,若需改变父类方法的行为,核心手段是方法重写(Override)——不是修改父类代码,而是在子类中提供同名、同参数、同返回类型的新实现。这是面向对象多态性的基础,也是安全可控的扩展方式。
必须满足的重写条件
只有同时满足以下四点,Java 才认定为合法重写,否则编译报错:
- 方法签名完全一致:方法名、参数个数、每个参数类型及顺序,必须与父类方法一模一样;
-
返回值类型相同或更具体:比如父类返回
Animal,子类可返回Dog(Dog 是 Animal 的子类),但不能返回Object; -
访问权限不能更严格:父类是
protected,子类只能用protected或public;父类是public,子类不能降为private或缺省; -
异常声明不能扩大范围:子类方法抛出的检查型异常,必须是父类方法所声明异常的子类或不抛出(例如父类声明
IOException,子类可声明FileNotFoundException,但不可声明Exception)。
哪些方法不能被重写
以下三类方法在子类中无法重写,尝试会编译失败或行为不符合预期:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- private 方法:子类根本不可见,谈不上重写;
- static 方法:属于类本身,子类定义同名 static 方法属于“隐藏(hiding)”,而非重写;
- final 方法:明确禁止被覆盖,编译器直接拦截。
正确使用 @Override 注解
在子类方法上显式添加 @Override 注解,不是可选,而是强烈推荐:
立即学习“Java免费学习笔记(深入)”;
- 它让编译器主动校验:是否真有可被重写的父类方法;
- 避免拼写错误(如
toSting())、参数误写(如少一个 int 参数)导致“看似重写实则新增”; - 提升代码可读性,一眼识别该方法意在定制父类行为。
需要调用父类原始逻辑时怎么办
重写不等于抛弃父类实现。若子类想在原有逻辑基础上增强(比如日志、校验、前后处理),可用 super.方法名() 显式调用父类版本:
- 例如重写
save()时,先执行super.save()完成数据持久化,再发通知或更新缓存; - 注意:
super只能在子类非静态方法中使用,且必须在构造方法中调用super()(若父类无无参构造); - 切勿在父类构造方法中调用可能被子类重写的方法——此时子类对象尚未初始化,易引发空指针或状态异常。

















