用途的区别
重载
重载指的是在同一个类中定义多个方法,它们具有相同的名称但不同的参数列表,可以是不同的参数类型、参数个数或参数顺序。
如下所示:
public class Calculator { public int add(int a, int b) { return a b; } public double add(double a, double b) { return a b; } }
在上述示例中,我们定义了一个名为 add
的类 Calculator
,它包含两个重载方法,一个接受整数参数,另一个接受双精度浮点数参数。
这两个方法具有相同的名称 add
,但参数类型不同,编译器会根据传递的参数类型来选择调用哪个方法。
重写
重写是指子类覆盖父类中具有相同名称、参数列表和返回类型的方法。
如下所示:
class Animal { public void makeSound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog barks"); } }
在上述示例中,我们有两个类:Animal 和 Dog。
Animal 类有一个 makeSound 方法,然后 Dog 类继承了 Animal 并重写了 makeSound 方法。
重写用于实现继承中的多态性,子类可以提供自己的实现以替代父类的方法。
位置的区别
重载:重载方法在同一个类中定义。
如下所示:
public class Calculator { public int add(int a, int b) { return a b; } public double add(double a, double b) { return a b; } public int add(int a, int b, int c) { return a b c; } }
重写:重写方法涉及到子类和父类之间的继承关系,子类中的方法覆盖了父类中的方法。
如下所示:
class Animal { public void makeSound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog barks"); } } class Cat extends Animal { @Override public void makeSound() { System.out.println("Cat meows"); } }
方法签名的区别
重载方法的方法签名必须不同,这包括方法名称相同但参数列表不同,或者参数类型、参数个数、参数顺序不同等。
如下图所示:
重写方法的方法签名必须与父类中的方法完全相同,包括方法名称、参数列表和返回类型。
返回类型的区别
重载:重载方法的返回类型可以相同,也可以不同。
重写:重写方法的返回类型,必须与父类中的方法相同,或者是其子类。
时机不同的区别
重载是编译时,根据方法签名(比如:方法名和参数列表),决定调用哪个方法。
重写是运行时,根据对象的实际类型决定调用哪个方法。