Java方法重载和方法重写

  • 在Java中,方法重载(Overloading)和方法重写(Overriding)是两种不同的概念,分别用于实现多态性和代码复用。

1. 方法重载(Overloading)

  • 方法重载是指在同一个类中,允许存在多个方法名相同但参数列表不同(参数类型、参数个数或参数顺序不同)的方法。方法重载通过编译时的静态绑定实现。方法重载是编译时多态的一种表现,它通过方法参数的不同来区分方法。

  • 特点:

    • 方法名相同,但参数列表不同(参数个数、类型、顺序)。
    • 返回类型可以相同也可以不同,但是不能仅通过返回类型来区分重载方法。
    • 方法重载发生在同一个类中。
  • 示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class MathUtils {
    // 方法重载示例
    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;
    }
    }

2. 方法重写(Overriding)

  • 方法重写是指在子类中重新实现父类中已经存在的方法,要求方法名、参数列表和返回类型都必须相同。方法重写通过运行时的动态绑定实现。方法重写发生在继承关系中,是运行时多态的一种体现。

  • 特点:

    • 子类重写父类的方法,方法名、参数列表和返回类型必须相同。
    • 只能发生在继承关系中(子类继承父类)。
    • 可以改变方法的视线,但不能改变方法签名。
    • 运行时多态:方法的调用决定于对象的实际类型,而不是引用类型。
  • 示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    class Animal {
    public void sound() {
    System.out.println("Animal makes a sound");
    }
    }

    class Dog extends Animal {
    // 重写父类的 sound 方法
    @Override
    public void sound() {
    System.out.println("Dog barks");
    }
    }

    class Cat extends Animal {
    // 重写父类的 sound 方法
    @Override
    public void sound() {
    System.out.println("Cat meows");
    }
    }

    public class Main {
    public static void main(String[] args) {
    Animal myDog = new Dog();
    Animal myCat = new Cat();

    myDog.sound(); // 输出 Dog barks
    myCat.sound(); // 输出 Cat meows
    }
    }

3. 总结

  • 重载和重写的主要区别:
特性 方法重载(Overloading) 方法重写(Overriding)
定义 在同一个类中,方法名相同,参数不同 子类重新实现父类的已存在的方法
发生地点 同一类中 子类继承父类时发生
方法签名 方法名相同,参数不同 方法名相同,参数相同
返回类型 返回类型可以不同(不作为重载的依据) 返回类型必须相同(或者是子类类型的子类)
访问修饰符 子类的访问修饰符可以更宽松(但不能更严格) 子类的访问修饰符不能更严格,必须是相同或更宽松
多态类型 编译时多态 运行时多态
调用方式 通过方法参数来区分调用哪个方法 通过对象的实际类型来调用方法