当前位置: 技术文章>> 100道Java面试题之-Java中的方法重载(Overloading)和方法重写(Overriding)有什么区别?
文章标题:100道Java面试题之-Java中的方法重载(Overloading)和方法重写(Overriding)有什么区别?
在Java中,方法重载(Overloading)和方法重写(Overriding)是面向对象编程中两个重要的概念,它们之间存在明显的区别。以下是这两个概念的主要区别:
### 一、定义与目的
* **方法重载(Overloading)**:在同一个类中,允许存在多个同名方法,只要它们的参数列表不同(参数个数、参数类型或参数的顺序不同)即可。方法重载的主要目的是为了提供灵活的方法调用,使得同一个方法名可以根据不同的参数类型或数量执行不同的操作。
* **方法重写(Overriding)**:子类可以提供一个特定签名的方法,该方法与父类中的某个方法具有相同的名称、返回类型和参数列表。子类通过重写父类的方法,可以定义特定于子类的行为。方法重写是面向对象中多态性的一个体现,它允许子类以特定的方式实现继承自父类的方法。
### 二、主要区别
| 特性 | 方法重载(Overloading) | 方法重写(Overriding) |
| :--: | :--: | :--: |
| **定义位置** | 同一个类中 | 子类与父类之间 |
| **方法名** | 必须相同 | 必须相同 |
| **参数列表** | 必须不同(参数个数、类型或顺序) | 必须相同 |
| **返回类型** | 可以相同,也可以不同(但在Java中,如果返回类型不同,则参数列表也必须不同,因为编译器无法仅通过返回类型来区分不同的方法) | 必须相同 |
| **访问修饰符** | 没有特殊要求 | 子类方法的访问修饰符不能比父类方法的更严格(例如,如果父类方法是public,则子类重写的方法也必须是public) |
| **抛出异常** | 可以不同 | 子类重写的方法抛出的异常类型应该是父类方法抛出异常类型的子类或相同类型(即子类方法不能抛出比父类方法更多的异常) |
| **多态性** | 编译时多态性 | 运行时多态性 |
### 三、示例
* **方法重载示例**:
```java
public class Demo {
public void add(int a, int b) {
System.out.println(a + b);
}
public void add(double a, double b) {
System.out.println(a + b);
}
public void add(String a, String b) {
System.out.println(a + b);
}
}
```
* **方法重写示例**:
```java
class Animal {
void makeSound() {
System.out.println("Some sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Woof");
}
}
```
### 四、总结
方法重载和方法重写是Java中两种不同的概念,它们各自服务于不同的目的。方法重载提供了在同一类中根据参数的不同调用不同方法的能力,而方法重写则允许子类对继承自父类的方法进行定制化的实现。理解这两个概念对于掌握Java面向对象编程至关重要。