📌 目录

  1. 概述
  2. 方法重写(Override)
  3. 方法重载(Overload)
  4. Override 与 Overload 的区别
  5. 参考资料
  6. 出站链接

1. 概述

在 Java 语言中,方法的**重写(Override)重载(Overload)**是两种不同的技术,它们都提高了代码的可读性和可维护性,但适用场景和规则不同。

  • 方法重写(Override):子类对父类的某个方法提供新的实现,覆盖原有方法。
  • 方法重载(Overload):在同一个类中,方法名相同但参数列表不同(参数个数或类型不同)。

2. 方法重写(Override)

2.1 基本概念

**方法重写(Method Overriding)**指的是子类提供一个与父类方法相同签名(方法名、参数列表、返回类型相同)的实现,目的是改变或增强父类的行为。

2.2 语法规则

重写方法的规则

  1. 方法名必须相同
  2. 参数列表必须完全相同
  3. 返回类型必须相同(Java 5+ 允许返回协变类型,即子类)
  4. 不能缩小访问权限(如父类方法是 public,子类不能是 protected
  5. 不能重写 final 方法
  6. 不能重写 static 方法(但可以隐藏)

2.3 示例代码

class Parent {
    void showMessage() {
        System.out.println("父类方法");
    }
}

class Child extends Parent {
    @Override
    void showMessage() {
        System.out.println("子类重写的方法");
    }
}

public class OverrideExample {
    public static void main(String[] args) {
        Parent obj = new Child();
        obj.showMessage();  // 调用子类重写的方法
    }
}

输出

子类重写的方法

2.4 @Override 注解

@Override 是可选的,但推荐使用,可以帮助编译器检查方法是否正确重写。

示例(如果方法签名不匹配,编译器会报错):

class Parent {
    void show() { }
}

class Child extends Parent {
    @Override
    void show() { }  // ✅ 正确
}

class Child extends Parent {
    @Override
    void shows() { }  // ❌ 编译错误(方法名不匹配)
}

2.5 重写与访问权限

父类方法权限子类方法的最低权限
publicpublic
protectedprotectedpublic
defaultdefaultprotectedpublic
private不能被重写

3. 方法重载(Overload)

3.1 基本概念

方法重载(Method Overloading)指的是在同一个类中,方法名称相同,但参数列表不同(参数类型、个数或顺序不同)。

重载的优点

  • 提高代码的可读性
  • 便于维护,提高复用性

3.2 语法规则

方法重载规则

  1. 方法名必须相同
  2. 参数列表必须不同(参数个数、类型或顺序不同)
  3. 返回值类型可以不同,但不能仅靠返回类型区分重载
  4. 不能使用 staticfinal 仅仅来区分重载

3.3 示例代码

class MathUtils {
    // 方法重载:参数个数不同
    int add(int a, int b) {
        return a + b;
    }

    int add(int a, int b, int c) {
        return a + b + c;
    }

    // 方法重载:参数类型不同
    double add(double a, double b) {
        return a + b;
    }
}

public class OverloadExample {
    public static void main(String[] args) {
        MathUtils math = new MathUtils();
        System.out.println(math.add(2, 3));       // 5
        System.out.println(math.add(2, 3, 4));    // 9
        System.out.println(math.add(2.5, 3.2));   // 5.7
    }
}


4. Override 与 Overload 的区别

区别重写(Override)重载(Overload)
适用范围父类与子类同一个类
方法名必须相同必须相同
参数列表必须相同必须不同(参数类型、个数、顺序)
返回类型必须相同(Java 5+ 支持协变返回类型)可以不同,但不能仅靠返回类型区分
访问修饰符不能比父类更严格可以任意
static 方法不能重写(但可以隐藏)可以重载
关键字@Override(可选)无需特殊关键字
适用场景改变父类方法的行为提供多个同名方法,支持不同的参数类型

5. 参考资料


6. 出站链接