为了账号安全,请及时绑定邮箱和手机立即绑定

Java 方法重载与方法重写的区别解析

标签:
Java JavaScript

原文来自于:https://zha-ge.cn/java/28

Java 方法重载与方法重写的区别解析

一场代码评审引发的思考

上周在代码评审会上,新同事小明提交了一段代码,团队Leader一眼就发现了问题:

“这里你用的是方法重载还是重写?”

小明有些困惑:“额…都差不多吧,反正都是同名方法。”

这一幕让我意识到,是时候深入探讨一下方法重载与重写的区别了。

方法重载:同一个类中的多态实现

方法重载的定义与示例

方法重载(Overloading)是指在一个类中定义多个方法,它们具有相同的方法名,但参数列表不同。编译器根据传入的参数类型和数量来选择具体调用的方法。

public class Restaurant {
    // 基础版:只要鸡蛋
    public void makeFriedRice(String egg) {
        System.out.println("制作蛋炒饭: " + egg);
    }
    
    // 豪华版:鸡蛋 + 海鲜
    public void makeFriedRice(String egg, String seafood) {
        System.out.println("制作海鲜炒饭: " + egg + " + " + seafood);
    }
    
    // 素食版:蔬菜 + 调料
    public void makeFriedRice(List<String> vegetables) {
        System.out.println("制作素食炒饭: " + vegetables);
    }
}

方法重载的特点

  • 发生位置:同一个类中
  • 方法名:必须相同
  • 参数列表:必须不同
  • 返回类型:可以不同
  • 访问权限:可以不同

方法重写:继承关系中的行为定制

方法重写的定义与示例

方法重写(Overriding)是指在子类中对父类的方法进行重新实现。子类重写的方法必须与父类的方法具有相同的方法名和参数列表。

// 总店的标准做法
class Restaurant {
    public void makeFriedRice() {
        System.out.println("标准炒饭:酱油调色,味精调味");
    }
}

// 四川分店:要加辣
class SichuanRestaurant extends Restaurant {
    @Override
    public void makeFriedRice() {
        System.out.println("川味炒饭:豆瓣酱爆炒,麻辣鲜香");
    }
}

// 广东分店:要清淡
class GuangdongRestaurant extends Restaurant {
    @Override  
    public void makeFriedRice() {
        System.out.println("粤式炒饭:生抽调色,保持原味");
    }
}

方法重写的特点

  • 发生位置:父子类之间
  • 方法名:必须相同
  • 参数列表:必须相同
  • 返回类型:必须相同(或协变)
  • 访问权限:不能更严格
  • 多态性:支持运行时多态

方法重载与重写的对比

特性 方法重载 Overloading 方法重写 Overriding
发生位置 同一个类内 父子类之间
方法名 必须相同 必须相同
参数列表 必须不同 必须相同
返回类型 可以不同 必须相同(或协变)
访问权限 可以不同 不能更严格
决策时机 编译时确定 运行时确定
多态性

实战中的选择策略

何时选择方法重载?

  • 功能相似,参数不同:如上面的炒饭例子
  • 提供便利接口String.valueOf(int)String.valueOf(double)
  • 构造函数:最常见的重载场景

何时选择方法重写?

  • 个性化实现:不同子类需要不同行为
  • 框架回调:Spring 的 @PostConstruct 方法
  • 模板方法模式:定义算法骨架,细节由子类实现

避坑指南

  1. 重写时一定加 @Override:确保方法是真正的重写
  2. 重载要让参数差异明显:避免歧义
  3. 重写不能降低访问权限:public → protected 会报错
  4. 静态方法不能被重写:只能被隐藏

总结:灵活运用,提升代码质量

方法重载和方法重写是Java编程中的重要特性,它们各有不同的适用场景和技术要求。掌握它们的区别,不仅有助于写出更清晰、更易维护的代码,也是成为一名优秀程序员的重要基石。

记住,优秀的编程不仅是写代码,更是合理选择和运用工具。这,才是真正的技术修养。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消