Java 方法重载与方法重写的区别解析
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方法 - 模板方法模式:定义算法骨架,细节由子类实现
避坑指南
- 重写时一定加
@Override:确保方法是真正的重写 - 重载要让参数差异明显:避免歧义
- 重写不能降低访问权限:public → protected 会报错
- 静态方法不能被重写:只能被隐藏
总结:灵活运用,提升代码质量
方法重载和方法重写是Java编程中的重要特性,它们各有不同的适用场景和技术要求。掌握它们的区别,不仅有助于写出更清晰、更易维护的代码,也是成为一名优秀程序员的重要基石。
记住,优秀的编程不仅是写代码,更是合理选择和运用工具。这,才是真正的技术修养。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦