Java中方法重写与重载有什么区别?
在Java中,方法的重写和重载是两种不同的概念,分别有不同的用途与规则。下面是两者的区别:
方法重写 (Method Overriding)
方法重写是指子类重新定义父类的同名方法(方法的签名必须与父类的某个方法完全一致)。目的是实现子类对父类方法行为的定制。
特点:
- 方法签名必须一致:方法名、参数列表(类型、顺序、个数)以及返回值类型必须与父类方法一致。
- 必须发生在继承关系中:即子类对父类方法的改写。
- 子类方法的访问权限不能比父类方法小。例如父类方法是
public,重写后也必须是public,而不能改为private。 - 子类方法的返回值类型可以与父类的一样,也可以是父类方法返回值的具体类型(满足协变返回类型规则)。
- 子类方法的抛出异常类型(若有)不能比父类的更宽泛。例如父类抛出
IOException,子类不能抛出Exception。 - 方法重写是运行时多态。调用的方法取决于运行时的对象类型,而不是编译时的引用类型。
示例代码:
Java
class Parent {
public void display() {
System.out.println("Parent display");
}
}
class Child extends Parent {
@Override
public void display() {
System.out.println("Child display");
}
}
public class Main {
public static void main(String[] args) {
Parent obj = new Child();
obj.display(); // 输出:Child display
}
}
方法重载 (Method Overloading)
方法重载是指在同一个类中定义多个方法,方法名相同但参数列表(类型、顺序、个数)不同。目的是增强方法的复用性和可读性。
特点:
- 方法名必须相同。
- 必须在同一个类中(尽管可以通过继承间接实现,但重载的核心不依赖继承)。
- 参数列表必须不同:可以是参数类型不同、参数个数不同或排列顺序不同。
- 返回值类型可以不同,但仅通过返回值不同不能实现重载,必须依赖参数列表的变化。
- 不要求抛出相同类型的异常。
- 方法重载是编译时多态。具体调用的方法在编译期根据实际传入的参数类型和数量进行解析。
示例代码:
Java
class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(2, 3)); // 输出:5
System.out.println(calc.add(2.5, 3.5)); // 输出:6.0
System.out.println(calc.add(1, 2, 3)); // 输出:6
}
}
区别总结
| 特性 | 方法重写 (Overriding) | 方法重载 (Overloading) |
| 定义位置 | 子类与父类之间 | 同一个类中 |
| 参数列表 | 必须完全一致 | 必须不同 |
| 返回值类型 | 可与父类相同或为更具体的类型(协变返回) | 可与其他重载方法不同 |
| 访问权限 | 子类方法的权限不能小于父类 | 没有限制 |
| 与继承的关系 | 必须存在继承关系 | 不要求继承关系 |
| 多态性 | 支持运行时多态 | 支持编译时多态 |
通过这些区别,你可以选择合适的机制,用来实现不同的功能需求,比如使用“重写”改写父类的方法行为或动态多态,而使用“重载”提供功能的多样性和灵活性。

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:http://choupangxia.com/2025/11/06/java-method-overriding-and-overloading/