Java中的方法复写(Override)和重载(Overload)都是实现多态性的方式,它们之间的区别如下:
方法复写:
子类继承了父类的方法,可以在子类中重新定义该方法,称为方法复写。 复写的方法必须与被复写的方法具有相同的名称、参数列表和返回值类型。 复写方法的访问修饰符不能更严格,可以更宽松。 方法的复写是发生在子类和父类之间的。
方法重载:
指在一个类中定义有多个名称相同但参数列表不同的方法,称为方法重载。 在方法重载中,参数个数、类型或顺序不同,但方法名称必须相同。 重载方法的访问修饰符必须相同。 相对于方法复写,方法重载是发生在同一个类中的。
在总结区别之前,先通过代码来看一下复写和重载的实现:
class Animal { public void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { public void eat() { System.out.println("Dog is eating"); } public void eat(String food) { System.out.println("Dog is eating " + food); } } public class Main { public static void main(String[] args) { Animal a = new Animal(); a.eat(); // "Animal is eating" Dog d = new Dog(); d.eat(); // "Dog is eating" d.eat("bone"); // "Dog is eating bone" } }
从上面的代码可以看出,复写和重载的不同之处在于:
- 复写是相同的方法在子类中重新定义,而重载是在同一个类中定义多个名称相同但参数列表不同的方法;
- 复写方法的参数列表与被复写的方法必须相同,而重载方法的参数列表不同;
- 复写方法的访问修饰符可以更宽松,而重载方法的访问修饰符必须相同;
- 复写方法是发生在子类和父类之间的,而重载方法是发生在同一个类中的。
综上所述,复写和重载虽然实现多态性的方式不同,但都能有效地提高代码的灵活性和可复用性,在使用时还需根据实际需求选择合适的方法。