Java 中重写和重载的区别是什么?(超详细)

更新时间 2023-03-31 20:27:39

Java 中的方法重载(Overloading)和方法重写(Overriding)是常见的面向对象编程的概念,它们有以下区别:

  1. 定义位置不同

方法重载(Overloading)指在同一个类中定义多个方法,它们具有相同的名称,但参数列表不同。方法重载可以提高代码复用率和灵活性,方便程序员进行方法的调用。方法重载的定义位置在同一个类中。

方法重写(Overriding)指子类重新定义了父类中已有的方法,方法名称、返回值类型、参数列表都必须与父类中的方法相同。方法重写可以实现多态性,使程序更加灵活。方法重写的定义位置在子类中。

  1. 执行时机不同

方法重载(Overloading)在编译时就确定了哪个方法会被调用,因为方法的调用是根据传入的参数类型来决定的。在编译时就能确定方法的调用。

方法重写(Overriding)在运行时才能确定哪个方法会被调用,因为方法的调用是根据实例对象的实际类型来决定的。在运行时才能确定方法的调用。

下面是一个示例代码,展示了方法重载和方法重写的区别:

class Animal {
    public void eat() {
        System.out.println("Animal eat");
    }
}

class Cat extends Animal {
    // 方法重写
    @Override
    public void eat() {
        System.out.println("Cat eat");
    }
    
    // 方法重载
    public void eat(String food) {
        System.out.println("Cat eat " + food);
    }
}

public class OverloadOverrideDemo {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.eat(); // 输出 Animal eat
        
        Cat cat = new Cat();
        cat.eat(); // 输出 Cat eat
        cat.eat("fish"); // 输出 Cat eat fish
    }
}

上述代码中,我们定义了 Animal 类和 Cat 类。Animal 类中定义了一个 eat() 方法,Cat 类继承了 Animal 类,并重写了 eat() 方法。此外,Cat 类中还定义了一个 eat(String food) 方法,实现了方法的重载。

在 main() 方法中,我们创建了一个 Animal 对象和一个 Cat 对象,并调用它们的 eat() 方法。由于 Animal 对象的实际类型是 Animal,因此调用的是 Animal 类中的 eat() 方法,输出 Animal eat。而 Cat 对象的实际类型是 Cat,因此调用的是 Cat 类中的 eat() 方法,输出 Cat eat。最后,我们还调用了 Cat 类中的 eat(String food) 方法,输出 Cat eat fish。这说明了方法重载和方法重写的不同之处。