「 Java 面向对象系列 09 」
上一篇我们学会了 继承 extends:子类可以拿到父类的所有公共方法。
但新问题来了:
如果父类的方法逻辑不适合子类 ,子类不想用父类旧逻辑,想 自己重新改写 怎么办?
答案就是:方法重写(Override)
重写是继承后最重要的操作,也是面试必考、和重载最容易混淆的知识点。
一、什么是方法重写?
重写:子类对父类已经存在的方法,进行重新实现、覆盖原有逻辑。
通俗理解:
父类有一个功能,子类不满意,不改父类代码,在子类自己重新写一遍,优先用子类自己的逻辑。
二、为什么需要重写?
举个场景:
父类 Person 有方法 say():普通人说话
子类 Teacher 继承后,想要 老师专属说话逻辑
这时就需要重写,覆盖父类方法。
三、重写完整实战案例
1. 定义父类
java
class Person{
public void say(){
System.out.println("普通人正常说话");
}
}
2. 子类重写父类方法
java
class Teacher extends Person{
// 重写父类say方法
@Override
public void say() {
System.out.println("老师讲课,温柔发言");
}
}
3. 测试运行
java
public class TestOverride {
public static void main(String[] args) {
Teacher t = new Teacher();
t.say(); // 执行的是子类重写后的方法
}
}
运行结果
老师讲课,温柔发言
✅ 可以看到:子类重写后,优先执行子类逻辑,父类方法被覆盖
四、重写的严格语法规则(必背)
想要构成合法重写,必须满足:
-
发生在父子类之间(必须有继承)
-
方法名、参数列表必须和父类完全一致
-
访问权限不能比父类更小
-
返回值、异常需要兼容
-
建议加上注解:@Override(校验是否是合法重写)
五、@Override 注解的作用
很多新手不知道这个注解干嘛的,其实非常重要:
✅ 自动校验当前方法 是否是合法重写
✅ 写错方法名、参数不对、权限不对,直接爆红报错
✅ 提高代码可读性,一眼看出这是重写方法
举个例子:注解帮你自动纠错
java
class Person {
public void say() {
System.out.println("普通人正常说话");
}
}
class Teacher extends Person {
// ✅ 正确重写
@Override
public void say() {
System.out.println("老师讲课,温柔发言");
}
// ❌ 写错方法名,编译报错!
@Override
public void sayy() { // 父类没有 sayy() 方法
System.out.println("老师讲课");
}
// ❌ 参数列表不一致,编译报错!
@Override
public void say(String word) { // 父类是 say(),参数不同
System.out.println("老师说:" + word);
}
}
加上 @Override 后,一旦写错(方法名写错、参数不对),编译器会直接报错提示,不用等到运行时才发现问题。
开发中 强烈建议每次重写都加上 @Override,让编译器帮你把关。
六、哪些方法不能被重写?
-
private 私有方法(子类根本看不到)
-
static 静态方法(属于类,不属于对象)
-
final 最终方法(禁止重写)
-
构造方法(不能继承自然不能重写)
七、重载 VS 重写 终极对比(新手必看)
这是 Java 面试最容易混淆的两大概念!
| 对比项 | 重载 Overload | 重写 Override |
|---|---|---|
| 发生范围 | 本类内部 | 父子类之间(需要继承) |
| 方法名 | 相同 | 相同 |
| 参数列表 | 必须不同 | 必须完全相同 |
| 返回值 | 无关 | 必须兼容 |
| 权限 | 无关 | 不能缩小权限 |
| 注解 | 不需要 | 推荐 @Override |
| 作用 | 方法多样化调用 | 子类覆盖父类逻辑 |
八、开发中重写最常用场景
-
父类通用逻辑不满足子类需求,需要自定义行为
-
项目中几乎所有实体类都会 重写 toString()
-
框架开发大量依赖重写做功能扩展
九、新手高频踩坑
坑1:重写时参数列表写错
参数类型/个数不一致,不是重写,是新方法!
坑2:重写权限比父类更小
父类 public,子类不能写 default / private,编译报错
坑3:静态方法当成重写
static 方法不叫重写,叫隐藏,完全两回事
坑4:分不清重载和重写
记住一句话:本类同名不同参是重载,父子同名同参是重写
十、全文核心小结
-
重写基于继承,子类覆盖父类原有方法逻辑
-
重写要求:方法名、参数列表完全一致,权限不缩小
-
使用 @Override 注解校验,杜绝写错
-
private、static、final、构造方法不能重写
-
重载看参数不同,重写看父子覆盖
🚀 下篇预告 :重写之后,我们想在子类中 调用父类原本的方法 怎么办?下一篇详解 super 关键字,完美搭配 this、继承、重写!