Java 面向对象核心入门(九):方法重写 Override|彻底分清重载与重写

「 Java 面向对象系列 09 」

📖 上篇回顾 :Java 面向对象核心入门(八):继承详解|代码复用的核心-CSDN博客

上一篇我们学会了 继承 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(); // 执行的是子类重写后的方法
    }
}

运行结果

复制代码
老师讲课,温柔发言

✅ 可以看到:子类重写后,优先执行子类逻辑,父类方法被覆盖

四、重写的严格语法规则(必背)

想要构成合法重写,必须满足:

  1. 发生在父子类之间(必须有继承)

  2. 方法名、参数列表必须和父类完全一致

  3. 访问权限不能比父类更小

  4. 返回值、异常需要兼容

  5. 建议加上注解:@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,让编译器帮你把关。

六、哪些方法不能被重写?

  1. private 私有方法(子类根本看不到)

  2. static 静态方法(属于类,不属于对象)

  3. final 最终方法(禁止重写)

  4. 构造方法(不能继承自然不能重写)

七、重载 VS 重写 终极对比(新手必看)

这是 Java 面试最容易混淆的两大概念!

对比项 重载 Overload 重写 Override
发生范围 本类内部 父子类之间(需要继承)
方法名 相同 相同
参数列表 必须不同 必须完全相同
返回值 无关 必须兼容
权限 无关 不能缩小权限
注解 不需要 推荐 @Override
作用 方法多样化调用 子类覆盖父类逻辑

八、开发中重写最常用场景

  1. 父类通用逻辑不满足子类需求,需要自定义行为

  2. 项目中几乎所有实体类都会 重写 toString()

  3. 框架开发大量依赖重写做功能扩展

九、新手高频踩坑

坑1:重写时参数列表写错

参数类型/个数不一致,不是重写,是新方法!

坑2:重写权限比父类更小

父类 public,子类不能写 default / private,编译报错

坑3:静态方法当成重写

static 方法不叫重写,叫隐藏,完全两回事

坑4:分不清重载和重写

记住一句话:本类同名不同参是重载,父子同名同参是重写

十、全文核心小结

  1. 重写基于继承,子类覆盖父类原有方法逻辑

  2. 重写要求:方法名、参数列表完全一致,权限不缩小

  3. 使用 @Override 注解校验,杜绝写错

  4. private、static、final、构造方法不能重写

  5. 重载看参数不同,重写看父子覆盖

🚀 下篇预告 :重写之后,我们想在子类中 调用父类原本的方法 怎么办?下一篇详解 super 关键字,完美搭配 this、继承、重写!

相关推荐
Pniubi1 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko71 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师1 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.2 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼2 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
福兮说4 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
紧跟先前的步伐5 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
const_qiu6 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
Promising_GEO6 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析