Skip to content

重写与重载

方法重写

重写(Override)是指子类定义了一个与其父类具有相同名称、参数列表和返回类型的方法,并且子类方法的实现 覆盖了父类方法的实现。

重写的好处在于子类可以根据需要,定义特定于自己的行为。

方法重写规则

  • 父类中被重写方法和子类中重写方法的 参数列表和方法名 必须相同;

  • 子类重写方法的访问权限不能比父类中被重写方法的访问权限低。例如:父类中方法被声明为 public,则子类中方法的访问权限不能为 protected 之类的;

  • 关于返回值类型:

    • 如果返回值类型为 基本数据类型 / void,则子类重写方法的返回值必须和父类被重写方法返回值相同;
    • 如果返回值类型为 引用数据类型,则子类被重写方法的返回值必须和父类被重写方法的返回值相同 或 是父类返回值类型的子类;
  • 子类重写方法抛出的异常类型可以与父类被重写方法抛出的异常相同,也可以是父类抛出异常类型的子类;

  • 声明为 final 的方法不能被重写;

  • 声明为 static 的方法不能被重写,但是能够被再次声明;

  • 父类和子类在同一个包中,则子类可以重写父类的所有方法,除了声明为 privatefinal 的方法;

  • 父类和子类不在同一个包中,那么子类只能重写父类声明为 publicprotectd 的非 final 方法;

java
class Animal {
  public int id;
  public String name;

  public Animal(int id, String name) {
    this.id = id;
    this.name = name;
  }

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

class Cat extends Animal {
  public Cat(int id, String name) {
    super(id, name);
  }

  //子类重写父类方法
  @Override
  public void eat() {
    System.out.println("Cat can eat food.");
  }
}
java
Animal a = new Animal(1, "cat1");
Animal c = new Cat(2, "cat2");

a.eat(); // Animal can eat food.
c.eat(); // Cat can eat food.

方法重载

重载(overloading)是在同一个类里面,允许存在多个同名方法,只要它们的参数列表不同即可。

多个同名方法彼此构成了重载,类中构造函数就是很好的重载示例。

重载规则

  • 被重载的方法必须改变参数列表(参数个数不同 / 参数类型不同);
  • 方法的重载与 权限修饰符、形参的名称、返回值 没有关系;
java
class Person {
  //构造器构成重载
  public Person() {
  }

  public Person(String name) {
  }

  //Test()构成重载
  public String Test(int num) {
    return null;
  }

  public boolean Test(boolean flag) {
    return flag;
  }

  public String Test(int num, String str) {
    return null;
  }
}

总结

方法的重写和重载都是 java 中多态性的不同表现:

  • 重写是父类与子类之间多态性的表现,而重载可以理解成多态的具体表现形式;
  • 方法重载是一个类中定义了多个方法名相同,而参数不同 / 参数类型不同 / 次序不同的方法;
  • 方法重写是在子类中存在与父类中相同名字的方法,并且参数个数和类型相同,返回值也相同;

img

img

Released under the MIT License.