java中重载和重写的区别
2025-02-01 09:10 阅读(73)

在 Java 中,重载(Overloading)和重写(Overriding)是两个重要的概念,它们都涉及到方法的定义和调用,但有着不同的应用场景和规则。下面详细解释两者的区别:

1. 重载(Overloading)

定义:


重载是指在一个类中可以有多个同名的方法,但这些方法的参数列表必须不同(参数的数量、类型或顺序不同)。


特点:


参数列表不同:方法的参数数量、类型或顺序不同。

返回类型可以不同:重载方法的返回类型可以不同,但不是区分重载方法的主要依据。

访问修饰符可以不同:重载方法的访问修饰符可以不同。

发生在同一个类中:重载方法必须在同一个类中定义。

https://www.zuocode.com

示例代码:

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, int b) {
        return a + b;
    }

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

2. 重写(Overriding)

定义:


重写是指子类重新定义父类中的方法,方法的名称、参数列表和返回类型必须完全相同。


特点:


方法签名相同:方法的名称、参数列表和返回类型必须完全相同。

访问修饰符不能更严格:子类中的访问修饰符不能比父类中的更严格(例如,父类方法是 public,子类方法不能是 private 或 protected)。

抛出的异常不能更多:子类方法抛出的异常不能比父类方法更多。

发生在继承关系中:重写方法必须在子类中定义,且父类中必须有相应的方法。


示例代码:

// 父类
public class Animal {
    public void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

// 子类
public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Bark");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog();

        myAnimal.makeSound(); // 输出: Some generic animal sound
        myDog.makeSound();    // 输出: Bark
    }
}

总结

重载:在同一类中,方法名相同但参数列表不同。

重写:在子类中,方法名、参数列表和返回类型与父类中的方法完全相同。