在Java中,`overload`(重载)和`override`(重写)是两个关键概念,它们在面向对象编程中扮演着重要角色,但各自有着不同的含义和用途。
### Overload(重载)
- **定义**:在同一个类中,允许存在多个同名方法,只要它们的参数列表不同即可。参数列表的不同包括参数的类型、顺序或数量不同。
- **特点**:
- 是编译时多态的一种体现。
- 调用哪个方法取决于方法的参数列表。
- 方法的返回类型、访问修饰符可以不同,但这些不是构成重载的必须条件。
- 方法名必须相同。
- **示例**:
public class Example {
void display(int a) {
System.out.println("Int: " + a);
}
void display(String s) {
System.out.println("String: " + s);
}
}
### Override(重写)
- **定义**:在子类中,如果有一个方法与父类中的某个方法的名称、返回类型以及参数列表都相同,则子类中的该方法被认为是重写了父类中的方法。
- **特点**:
- 是运行时多态的一种体现。
- 子类重写的方法可以调用父类中被重写的方法(使用`super`关键字)。
- 子类重写的方法访问权限不能比父类中被重写的方法更严格。
- 方法名、参数列表以及返回类型(如果是子类重写的方法)必须相同。
- 如果父类方法为`final`或`private`,则子类不能被重写。
- **示例**:
class Animal {
void eat() {
System.out.println("Animal eats food.");
}
}
class Dog extends Animal {
@Override
void eat() {
System.out.println("Dog eats meat.");
}
}
### 总结
- **Overload** 是同一类中方法的多态性表现,主要通过不同的参数列表来区分。
- **Override** 是子类与父类之间方法的多态性表现,要求方法名、参数列表及返回类型(如果是子类重写的方法)相同,主要通过对象的实际类型来区分调用哪个方法。