## 重载(Overloading)与重写(Overriding)的比较
在 Java 中,重载和重写是两种不同的概念,它们涉及到方法的多态性和对象的继承关系。
### 重载(Overloading)
重载发生在同一个类中,用于定义多个同名但参数列表不同的方法。
- **发生位置**:同一个类内部。
- **条件**:方法名称相同,参数列表不同(参数的类型、个数、顺序)。
- **绑定时期**:编译期进行绑定。
- **返回值**:重载与方法的返回值类型无关,只看方法名和参数列表。
- **示例**:
```java
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
```
### 重写(Overriding)
重写发生在父子类之间,用于在子类中重新定义父类中已有的方法,使得子类可以根据自身需求改变方法的实现。
- **发生位置**:父子类之间。
- **条件**:方法的名称、返回值类型、参数列表相同。
- **绑定时期**:运行期进行绑定(动态绑定,也称为运行时多态性)。
- **示例**:
```java
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` 注解可以明确表示该方法是重写父类方法。
### 总结
- 重载关注方法名和参数列表,允许在同一个类中定义多个同名方法。
- 重写关注方法的实现,允许子类对父类方法进行重新定义,以适应自身的需要。
- 重载在编译期进行绑定,根据调用方法的参数列表来决定调用哪个重载方法。
- 重写在运行时进行绑定,根据实际对象的类型来决定调用哪个重写方法。