1. 方法重载(Overloading)

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

1.1 特点

  1. 方法名相同

  2. 参数列表不同(类型、数量、顺序)

  3. 返回类型可以相同或不同(与重载无关)

  4. 修饰符可以不同

1.2 示例

public class Calculator {

    // 两个整数相加
    public int add(int a, int b) {
        return a + b;
    }

    // 三个整数相加
    public int add(int a, int b, int c) {
        return a + b + c;
    }

    // 两个小数相加
    public double add(double a, double b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        System.out.println(calc.add(1, 2));       // 3
        System.out.println(calc.add(1, 2, 3));    // 6
        System.out.println(calc.add(1.5, 2.5));   // 4.0
    }
}

总结

  • 重载发生在编译时,根据参数列表决定调用哪一个方法

  • 与继承无关(在同一个类中即可)


2. 方法重写(Overriding)

方法重写是 子类重新定义父类中已经存在的方法,用于实现多态。

2.1 特点

  1. 方法名相同

  2. 参数列表必须相同

  3. 返回类型相同或协变类型(Java 5+ 支持协变返回类型)

  4. 子类方法访问权限 ≥ 父类方法访问权限

  5. 子类方法不能缩小父类方法的权限(例如父类 public,子类不能用 private

  6. static 方法不能被重写(可以隐藏)

  7. 父类方法可以加 final,子类不能重写

2.2 示例

class Animal {
    public void makeSound() {
        System.out.println("动物叫");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("汪汪汪");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal a = new Dog();
        a.makeSound(); // 输出:汪汪汪(多态)
    }
}

总结

  • 重写发生在运行时,表现为多态

  • 必须在父类和子类中方法签名完全一致

  • 可以使用 @Override 注解,帮助编译器检查


3. 方法重载 vs 方法重写对比

特性 方法重载(Overload) 方法重写(Override)
所在位置 同一类 父类与子类
方法名 相同 相同
参数列表 不同 必须相同
返回类型 可以不同 相同或协变
发生时间 编译时 运行时
多态
static 方法 可以重载 不能重写(隐藏)

4. 小结与示例

class Calculator {
    // 重载示例
    public int add(int a, int b) { return a + b; }
    public double add(double a, double b) { return a + b; }
}

class Animal {
    public void eat() { System.out.println("动物吃东西"); }
}

class Dog extends Animal {
    @Override
    public void eat() { System.out.println("狗吃骨头"); }
}

public class Main {
    public static void main(String[] args) {
        // 方法重载
        Calculator calc = new Calculator();
        System.out.println(calc.add(1, 2)); // 3
        System.out.println(calc.add(1.5, 2.5)); // 4

        // 方法重写
        Animal a = new Dog();
        a.eat(); // 多态,输出:狗吃骨头
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐