在Java中,重写和重载是方法的重要特性,初学者很容易混淆。它们都能让方法“改头换面”,但本质区别很大,今天我们就来详细区分这两个概念。
一、方法重载(Overload):“换参数”的分身术¶
想象你有一个计算器,需要处理不同类型的数字相加:两个整数相加、两个小数相加、甚至三个整数相加。这时候,你可以用同一个方法名,但不同的参数来实现,这就是“重载”。
定义:¶
在同一个类中,方法名相同,但参数列表不同(参数的类型、数量或顺序不同),称为方法重载。
返回值类型、访问修饰符、抛出异常可以不同,但仅看参数列表区分重载。
例子:¶
public class Calculator {
// 重载1:两个int相加
public int add(int a, int b) {
return a + b;
}
// 重载2:两个double相加(参数类型不同)
public double add(double a, double b) {
return a + b;
}
// 重载3:三个int相加(参数数量不同)
public int add(int a, int b, int c) {
return a + b + c;
}
}
调用时,Java会根据传入的参数自动匹配方法:
Calculator calc = new Calculator();
int sum1 = calc.add(1, 2); // 匹配第一个add(int, int)
double sum2 = calc.add(1.5, 2.5); // 匹配第二个add(double, double)
int sum3 = calc.add(1, 2, 3); // 匹配第三个add(int, int, int)
注意:¶
- 仅参数列表不同才能重载,返回值不同不算重载。例如:
// 错误!参数相同,返回值不同,不能构成重载
public int add(int a, int b) { return a + b; }
public double add(int a, int b) { return a + b; } // 编译报错
- 静态方法也可以重载,比如
public static void show()和public static void show(String msg)。
二、方法重写(Override):“换实现”的升级改造¶
当子类继承父类后,可能需要修改父类方法的具体实现(比如父类的“动物叫”方法,子类“狗”要改成“汪汪叫”),这就是“重写”。
定义:¶
子类继承父类后,重新实现父类的方法。要求:
- 方法名、参数列表完全相同(方法签名必须一致)。
- 返回值类型:子类返回值需是父类返回值类型的子类(如父类返回Object,子类返回String)。
- 访问权限:子类不能比父类更严格(比如父类是public,子类不能是private)。
- 异常抛出:子类抛出的异常范围不能超过父类。
例子:¶
// 父类:动物类
class Animal {
public void bark() {
System.out.println("动物发出叫声");
}
}
// 子类:狗类(继承Animal)
class Dog extends Animal {
// 重写父类的bark()方法
@Override
public void bark() {
System.out.println("汪汪汪!"); // 重写后的新实现
}
}
调用时,多态会优先执行子类的重写方法:
Animal animal = new Dog(); // 向上转型
animal.bark(); // 输出:汪汪汪!
注意:¶
- 参数列表必须完全相同,否则是重载而非重写。例如:
class Dog extends Animal {
// 错误!参数不同,不是重写(是新方法)
public void bark(String sound) {
System.out.println(sound);
}
}
- 静态方法不能被重写,只能“隐藏”。例如父类有
static void bark(),子类用static void bark()会隐藏父类方法,而非重写。
三、重载 vs 重写:核心区别速查表¶
| 特性 | 方法重载(Overload) | 方法重写(Override) |
|---|---|---|
| 发生位置 | 同一类中 | 子类与父类之间 |
| 参数列表 | 必须不同(类型、数量、顺序) | 必须完全相同 |
| 方法名 | 相同 | 相同 |
| 继承关系 | 与继承无关 | 依赖子类继承父类 |
| 返回值 | 可不同 | 父类返回值的子类 |
| 核心目的 | 同一类中提供多参数处理方式 | 子类对父类方法的功能升级 |
总结:一句话分清¶
- 重载:同一类,“换参数”(方法名相同,参数不同)。
- 重写:子类,“换实现”(方法名、参数相同,返回更具体)。
记住:重载看“参数”,重写看“继承”!多写例子练习,就能快速掌握啦。