什么是方法重载和方法重写?
方法重载(Method Overloading)和方法重写(Method Overriding)是Java中两个重要的概念,它们都涉及到多态性,但用于不同的场景。
### 方法重载(Method Overloading)
方法重载是指在同一个类中,可以定义多个方法,它们具有相同的方法名,但参数列表(参数的类型、数量或顺序)不同。方法重载是编译时多态性的一种表现。
#### 特点:
1. **方法名相同**:重载的方法必须具有相同的方法名。
2. **参数列表不同**:重载的方法必须具有不同的参数列表(不同的参数类型、数量或顺序)。
3. **返回类型可以相同或不同**:重载的方法可以有相同或不同的返回类型,但返回类型不同不能作为区分重载的方法的依据。
4. **编译时决定**:方法重载是在编译时由编译器决定调用哪个方法。
#### 示例代码:
```java
class MathUtils {
// 重载的add方法
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
public static void main(String[] args) {
MathUtils mu = new MathUtils();
System.out.println(mu.add(5, 3)); // 调用第一个add方法,输出:8
System.out.println(mu.add(5.5, 3.2)); // 调用第二个add方法,输出:8.7
System.out.println(mu.add(1, 2, 3)); // 调用第三个add方法,输出:6
}
}
```
### 方法重写(Method Overriding)
方法重写是指在子类中重新定义从父类继承的方法,方法名、参数列表和返回类型必须与父类中的方法相同。方法重写是运行时多态性的一种表现。
#### 特点:
1. **方法名相同**:重写的方法必须与父类中的方法具有相同的方法名。
2. **参数列表相同**:重写的方法必须与父类中的方法具有相同的参数列表。
3. **返回类型相同**:重写的方法必须与父类中的方法具有相同的返回类型(Java 5之后,可以是协变返回类型,即返回类型可以是父类方法返回类型的子类型)。
4. **访问修饰符不能更严格**:重写的方法的访问修饰符不能比父类中的方法更严格,但可以更宽松。
5. **运行时决定**:方法重写是在运行时由Java虚拟机(JVM)决定调用哪个方法。
#### 示例代码:
```java
class Animal {
void makeSound() {
System.out.println("Some generic animal sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // 输出:Bark
myCat.makeSound(); // 输出:Meow
}
}
```
### 比较总结:
- **方法重载**:
- 发生在同一个类中。
- 方法名相同,但参数列表不同。
- 可以有不同的返回类型。
- 编译时多态性。
- **方法重写**:
- 发生在子类与父类之间。
- 方法名、参数列表和返回类型都必须相同(或协变返回类型)。
- 访问修饰符不能更严格。
- 运行时多态性。
方法重载和方法重写都是Java多态性的表现形式,通过它们可以提高代码的可读性和灵活性。