Java重写与重载:方法的‘改头换面’与‘改头换面’,必分清

在Java中,重写和重载是方法的重要特性,初学者很容易混淆。它们都能让方法“改头换面”,但本质区别很大,今天我们就来详细区分这两个概念。

一、方法重载(Overload):“换参数”的分身术

想象你有一个计算器,需要处理不同类型的数字相加:两个整数相加、两个小数相加、甚至三个整数相加。这时候,你可以用同一个方法名,但不同的参数来实现,这就是“重载”。

定义:

同一个类中,方法名相同,但参数列表不同(参数的类型、数量或顺序不同),称为方法重载。
返回值类型、访问修饰符、抛出异常可以不同,但仅看参数列表区分重载。

例子:

public class Calculator {
    // 重载1:两个int相加
    public int add(int a, int b) {
        return a + b;
    }

    // 重载2:两个double相加(参数类型不同)
    public double add(double a, double b) {
        return a + b;
    }

    // 重载3:三个int相加(参数数量不同)
    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

调用时,Java会根据传入的参数自动匹配方法:

Calculator calc = new Calculator();
int sum1 = calc.add(1, 2);       // 匹配第一个add(int, int)
double sum2 = calc.add(1.5, 2.5); // 匹配第二个add(double, double)
int sum3 = calc.add(1, 2, 3);     // 匹配第三个add(int, int, int)

注意:

  • 仅参数列表不同才能重载,返回值不同不算重载。例如:
  // 错误!参数相同,返回值不同,不能构成重载
  public int add(int a, int b) { return a + b; }
  public double add(int a, int b) { return a + b; } // 编译报错
  • 静态方法也可以重载,比如public static void show()public static void show(String msg)

二、方法重写(Override):“换实现”的升级改造

当子类继承父类后,可能需要修改父类方法的具体实现(比如父类的“动物叫”方法,子类“狗”要改成“汪汪叫”),这就是“重写”。

定义:

子类继承父类后,重新实现父类的方法。要求:
- 方法名、参数列表完全相同(方法签名必须一致)。
- 返回值类型:子类返回值需是父类返回值类型的子类(如父类返回Object,子类返回String)。
- 访问权限:子类不能比父类更严格(比如父类是public,子类不能是private)。
- 异常抛出:子类抛出的异常范围不能超过父类。

例子:

// 父类:动物类
class Animal {
    public void bark() {
        System.out.println("动物发出叫声");
    }
}

// 子类:狗类(继承Animal)
class Dog extends Animal {
    // 重写父类的bark()方法
    @Override
    public void bark() {
        System.out.println("汪汪汪!"); // 重写后的新实现
    }
}

调用时,多态会优先执行子类的重写方法:

Animal animal = new Dog(); // 向上转型
animal.bark(); // 输出:汪汪汪!

注意:

  • 参数列表必须完全相同,否则是重载而非重写。例如:
  class Dog extends Animal {
      // 错误!参数不同,不是重写(是新方法)
      public void bark(String sound) { 
          System.out.println(sound);
      }
  }
  • 静态方法不能被重写,只能“隐藏”。例如父类有static void bark(),子类用static void bark()会隐藏父类方法,而非重写。

三、重载 vs 重写:核心区别速查表

特性 方法重载(Overload) 方法重写(Override)
发生位置 同一类中 子类与父类之间
参数列表 必须不同(类型、数量、顺序) 必须完全相同
方法名 相同 相同
继承关系 与继承无关 依赖子类继承父类
返回值 可不同 父类返回值的子类
核心目的 同一类中提供多参数处理方式 子类对父类方法的功能升级

总结:一句话分清

  • 重载:同一类,“换参数”(方法名相同,参数不同)。
  • 重写:子类,“换实现”(方法名、参数相同,返回更具体)。

记住:重载看“参数”,重写看“继承”!多写例子练习,就能快速掌握啦。

小夜