在 Java 中,Overload(方法重载) 和 Override(方法重写) 都是面向对象编程中的多态性实现方式,但它们的目的和使用场景不同。
1. Overload(方法重载)
方法重载指的是在同一个类中,定义多个方法,这些方法具有相同的名称,但参数列表不同(参数类型、数量或顺序不同)。返回类型可以相同或不同,但返回类型并不决定重载。
特点
- 必须在同一个类中进行。
- 方法名相同,但参数列表必须不同(参数类型、数量、顺序)。
- 返回类型可以不同,但不会仅靠返回类型来区分方法。
- 可以应用于构造方法。
2. Override(方法重写)
方法重写指的是在子类中对父类中的方法进行重新实现,它允许子类根据自身的需求提供特定的实现,而不改变方法的签名(方法名称、参数类型和数量)。
特点
- 必须在继承关系中使用(子类和父类)。
- 方法名、参数列表必须与父类的方法相同。
- 返回类型必须相同或是子类类型(Java 5 以后支持协变返回类型)。
- 访问修饰符不能比父类方法的更严格(例如,如果父类的方法是
public
,子类不能将它改为protected
)。 - 可以使用
@Override
注解,帮助编译器检查是否正确重写了父类方法。
3. Overload 和 Override 的区别
特性 | Overload(方法重载) | Override(方法重写) |
---|---|---|
发生位置 | 同一个类中 | 子类与父类之间 |
方法签名 | 方法名相同,参数列表不同 | 方法名、参数列表必须完全相同 |
返回类型 | 可以相同或不同,但不能仅依赖返回类型来区分重载 | 必须相同或是子类类型(协变返回类型) |
访问修饰符 | 无严格要求 | 子类方法的修饰符不能比父类的更严格 |
注解 | 通常不需要注解 | 建议使用 @Override 注解来显式声明 |
多态性 | 静态多态性(编译时多态) | 动态多态性(运行时多态) |
应用场景 | 方法名相同但实现不同,提供不同的参数处理方式 | 子类提供对父类方法的不同实现 |
4. 总结
- 方法重载是在同一类中实现相同方法名但不同参数列表的功能,适用于不同参数类型或数量的操作。
- 方法重写是子类提供对父类方法的不同实现,是实现动态多态的核心。