在Java中什么是方法重载与方法重写

方法重载发生在同一类中,方法名相同但参数列表不同,返回类型可不同,用于编译时多态;方法重写发生在子类继承父类时,方法名、参数列表、返回类型均相同,用于运行时多态,调用由对象实际类型决定。

在Java中,方法重载方法重写是两个与方法相关的不同概念,它们都体现了多态性,但应用场景和规则完全不同。

方法重载(Overloading)

法重载发生在同一个类中,指的是多个方法具有相同的名称,但参数列表不同。返回类型可以相同也可以不同,只要参数的个数、类型或顺序不一样即可。

方法重载的目的是让同一个方法名可以根据不同的参数执行不同的逻辑,提高代码的可读性和复用性。

例如:

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

这三个add方法名称相同,但参数不同,构成重载。

方法重写(Overriding)

方法重写发生在子类继承父类时,子类提供了一个与父类中某个方法具有相同名称、相同参数列表和相同返回类型的方法,从而覆盖父类的方法实现。

方法重写用于实现运行时多态,即调用哪个方法由对象的实际类型决定。

重写需满足以下条件:

  • 方法名和参数列表必须完全一致
  • 返回类型要相同或是其子类(协变返回)
  • 访问权限不能比父类更严格(如父类是protected,子类不能是private)
  • 不能重写父类的private、static或final方法

示例:

class Animal {
    public void makeSound() {
        System.out.println("Animal makes sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Dog barks");
    }
}

当使用Animal a = new Dog(); a.makeSound();时,会输出"Dog barks",这就是重写的效果。

基本上就这些。重载是编译时多态,看参数;重写是运行时多态,看对象。理解清楚两者区别,对掌握面向对象编程很重要。