3.3 方法重载与重写
方法重载(Overloading)
定义
方法重载是指在同一个类中,允许存在多个同名方法,但这些方法的参数列表必须不同(参数类型、参数个数或参数顺序不同)。方法重载与返回值类型无关。
特点
- 相同的方法名:重载的方法名称必须相同。
- 不同的参数列表:参数的类型、数量或顺序必须不同。
- 与返回值无关:返回值类型可以相同也可以不同。
- 发生在同一个类中:重载方法必须在同一个类中定义。
示例代码
public class Calculator {
// 方法重载示例:加法方法
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
应用场景
- 提供多种参数组合的相同功能方法。
- 提高代码的可读性和灵活性。
方法重写(Overriding)
定义
方法重写是指子类重新定义父类中已有的方法。重写的方法必须具有相同的方法名、参数列表和返回类型(或子类返回类型)。
特点
- 相同的方法签名:方法名、参数列表和返回类型必须与父类方法一致。
- 访问权限不能更低:子类方法的访问权限不能比父类方法更严格(例如,父类方法是
protected,子类方法可以是public或protected,但不能是private)。 - 发生在继承关系中:重写方法必须在子类中定义。
- 不能重写
final或static方法:final方法不能被重写,static方法属于类而非实例,因此也不涉及重写。
示例代码
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}
@Override注解
- 用于显式标记方法重写,帮助编译器检查方法签名是否正确。
- 如果方法签名与父类不匹配,编译器会报错。
应用场景
- 子类需要修改或扩展父类的行为。
- 实现多态性(通过父类引用调用子类方法)。
方法重载与重写的区别
| 特性 | 方法重载(Overloading) | 方法重写(Overriding) |
|---|---|---|
| 定义位置 | 同一个类中 | 子类中 |
| 方法签名 | 必须不同(参数类型、数量或顺序) | 必须相同 |
| 返回值类型 | 可以不同 | 必须相同(或子类返回类型) |
| 访问权限 | 无限制 | 子类方法不能更严格 |
| 作用 | 提供多种参数组合的相同功能 | 修改或扩展父类行为 |
常见问题与注意事项
重载与返回类型无关:仅通过返回类型不同无法实现重载。
// 错误示例:编译报错 public int calculate(int a, int b) { return a + b; } public double calculate(int a, int b) { return a + b; }重写时子类方法不能抛出更宽泛的异常:子类方法抛出的异常不能比父类方法更宽泛(例如,父类抛出
IOException,子类不能抛出Exception)。静态方法不能被重写:静态方法属于类,子类可以定义同名静态方法,但这是隐藏(Hiding)而非重写。
构造方法不能重写:构造方法不是继承的,因此不存在重写。
总结
- 方法重载:通过不同参数列表实现同名方法,增强代码灵活性。
- 方法重写:子类重新定义父类方法,实现多态性。
- 两者是面向对象编程中实现代码复用和多态的重要机制。
