重载和重写的区别(5大区别详解)

用途的区别

重载

重载指的是在同一个类中定义多个方法,它们具有相同的名称但不同的参数列表,可以是不同的参数类型、参数个数或参数顺序。

如下所示:

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");
    }
}

 

方法签名的区别

重载方法的方法签名必须不同,这包括方法名称相同但参数列表不同,或者参数类型、参数个数、参数顺序不同等。

如下图所示:

重载和重写的区别(5大区别详解)-mikechen

重写方法的方法签名必须与父类中的方法完全相同,包括方法名称、参数列表和返回类型。

 

返回类型的区别

重载:重载方法的返回类型可以相同,也可以不同。

重写:重写方法的返回类型,必须与父类中的方法相同,或者是其子类。

 

时机不同的区别

重载是编译时,根据方法签名(比如:方法名和参数列表),决定调用哪个方法。

重写是运行时,根据对象的实际类型决定调用哪个方法。

评论交流
    说说你的看法