在 Java 中,重载(Overloading)和重写(Overriding)是两个重要的概念,它们都涉及到方法的定义和调用,但有着不同的应用场景和规则。下面详细解释两者的区别:
1. 重载(Overloading)
定义:
重载是指在一个类中可以有多个同名的方法,但这些方法的参数列表必须不同(参数的数量、类型或顺序不同)。
特点:
参数列表不同:方法的参数数量、类型或顺序不同。
返回类型可以不同:重载方法的返回类型可以不同,但不是区分重载方法的主要依据。
访问修饰符可以不同:重载方法的访问修饰符可以不同。
发生在同一个类中:重载方法必须在同一个类中定义。
示例代码:
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
}
}
总结
重载:在同一类中,方法名相同但参数列表不同。
重写:在子类中,方法名、参数列表和返回类型与父类中的方法完全相同。