一、方法的重写(Override)指的是在子类中定义一个与父类中具有相同名称和参数列表的方法,从而覆盖(替代)父类中的方法。在 Java 中,方法重写有一些规则需要遵循:
- 方法的名称、参数列表和返回类型必须与父类中的被重写方法完全相同。
- 子类中重写的方法不能比父类中的方法访问权限更严格。也就是说,如果父类中的方法是
public
,那么子类中的方法可以是public
或者protected
,但不能是private
。 - 子类中重写的方法的返回类型必须与父类中被重写方法的返回类型相同,或是其子类。
- 子类方法声明抛出的异常类型不能比父类方法声明抛出的异常类型更广泛。
class Animal { public void sound() { System.out.println("动物发出声音"); } } class Dog extends Animal { // 重写父类的 sound 方法 @Override public void sound() { System.out.println("狗发出汪汪的声音"); } } public class Main { public static void main(String[] args) { Animal animal = new Animal(); animal.sound(); // 输出:动物发出声音 Dog dog = new Dog(); dog.sound(); // 输出:狗发出汪汪的声音 // 使用父类引用指向子类对象 Animal anotherDog = new Dog(); anotherDog.sound(); // 输出:狗发出汪汪的声音 } }
二、方法的重载(Overload)是指在同一个类中可以定义多个方法,它们具有相同的名称但具有不同的参数列表。在 Java 中,方法重载遵循以下规则:
- 方法的名称必须相同。
- 方法的参数列表必须不同,要么参数的数量不同,要么参数的类型不同,或者参数的顺序不同。
- 方法的返回类型可以相同也可以不同。
- 方法的访问修饰符、异常列表、是否是静态方法等其他修饰符可以相同也可以不同。
在调用重载方法时,Java 编译器会根据传入的参数的数量和类型选择最匹配的方法。方法重载可以提高代码的可读性和灵活性,使得我们可以使用相同的方法名来处理多种情况下的不同参数。
举例来说,以下是一个方法重载的示例:
public class Calculator {
public int add(int x, int y) {
return x + y;
}
public double add(double x, double y) {
return x + y;
}
public int add(int x, int y, int z) {
return x + y + z;
}
}