在Java中,方法的重写重载是两种不同的概念,分别有不同的用途与规则。下面是两者的区别:


方法重写 (Method Overriding)

方法重写是指子类重新定义父类的同名方法(方法的签名必须与父类的某个方法完全一致)。目的是实现子类对父类方法行为的定制。

特点:

  1. 方法签名必须一致:方法名、参数列表(类型、顺序、个数)以及返回值类型必须与父类方法一致。
  2. 必须发生在继承关系中:即子类对父类方法的改写。
  3. 子类方法的访问权限不能比父类方法小。例如父类方法是public,重写后也必须是public,而不能改为private
  4. 子类方法的返回值类型可以与父类的一样,也可以是父类方法返回值的具体类型(满足协变返回类型规则)。
  5. 子类方法的抛出异常类型(若有)不能比父类的更宽泛。例如父类抛出IOException,子类不能抛出Exception
  6. 方法重写是运行时多态。调用的方法取决于运行时的对象类型,而不是编译时的引用类型。

示例代码:

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)

方法重载是指在同一个类中定义多个方法,方法名相同但参数列表(类型、顺序、个数)不同。目的是增强方法的复用性和可读性。

特点:

  1. 方法名必须相同
  2. 必须在同一个类中(尽管可以通过继承间接实现,但重载的核心不依赖继承)。
  3. 参数列表必须不同:可以是参数类型不同、参数个数不同或排列顺序不同。
  4. 返回值类型可以不同,但仅通过返回值不同不能实现重载,必须依赖参数列表的变化。
  5. 不要求抛出相同类型的异常。
  6. 方法重载是编译时多态。具体调用的方法在编译期根据实际传入的参数类型和数量进行解析。

示例代码:

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)
定义位置子类与父类之间同一个类中
参数列表必须完全一致必须不同
返回值类型可与父类相同或为更具体的类型(协变返回)可与其他重载方法不同
访问权限子类方法的权限不能小于父类没有限制
与继承的关系必须存在继承关系不要求继承关系
多态性支持运行时多态支持编译时多态

通过这些区别,你可以选择合适的机制,用来实现不同的功能需求,比如使用“重写”改写父类的方法行为或动态多态,而使用“重载”提供功能的多样性和灵活性。



Java中方法重写与重载有什么区别?插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://choupangxia.com/2025/11/06/java-method-overriding-and-overloading/