5.6.2 重写父类的方法

5.6.2 重写父类的方法

子类扩展了父类,子类是一个特殊的父类。大部分时候,子类总是以父类为基础,额外增加新的成员变量和方法。但有一种情况例外:子类需要重写父类的方法。

方法重写

子类包含与父类同名方法的现象被称为方法重写(Override),也被称为方法覆盖。可以说子类重写了父类的方法,也可以说子类覆盖了父类的方法

方法重写规则

方法的重写要遵循”两同两小一大”规则,

  • “两同”即
    • 方法名相同、
    • 形参列表相同:
  • “两小”指的是
    • 子类方法返回值类型应比父类方法返回值类型更小或相等,
    • 子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
  • “一大”指的是
    • 子类方法的访问权限应比父类方法的访问权限更大或相等

尤其需要指出的是,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,个是实例方法

子类 对象 无法访问被覆盖父类的方法

当子类覆盖了父类方法后,子类的对象将无法访问父类中被覆盖的方法,

子类 方法 可以调用被覆盖的父类方法

虽然子类对象无法调父类中被覆盖的方法,但可以在子类方法中调用父类中被覆盖的方法。

子类方法 中如何调用被覆盖的父类方法

如果需要在子类方法中调用父类中被覆盖的方法,

  • 若被覆盖的是实例方法则可以使用super作为调用者来调用父类中被覆盖的方法
  • 若被覆盖的是类方法则可以使用父类类名作为调用者来调用父类中被覆盖的方法

父类中private修饰的方法无法重写

如果父类方法具有private访问权限,则该方法对其子类是隐藏的,因此其子类无法访问该方法,也就是无法重写该方法。

所谓重写父类private方法只不过是子类中定义的新方法,不算重写

如果子类中定义了一个与父类private方法具有相同的方法名相同的形参列表相同的返回值类型的方法,依然不是重写,只是在子类中重新定义了一个新方法。例如,下面代码是完全正确的

重载和重写的区别

方法重载和方法重写在英语中分别是overloadoverride,
其实把重载和重写放在一起比较本身没有太大的意义

  • 因为重载主要发生在同一个类的多个同名方法之间,
  • 而重写发生在子类父类的同名方法之间。

它们之间的联系很少,除二者都是发生在方法之间,并要求方法名相同之外,没有太大的相似之处。

父类方法和子类方法 可以重载

父类方法和子类方法之间也可能发生重载,因为子类会获得父类方法。

方法重写要求

  1. 方法名相同
  2. 形参列表相同:
  3. 返回值类型更小或相等
  4. 抛出的异常类更小或相等
  5. 访问权限更大或相等

方法重载的要求

方法重载的要求就是两同一不同:

  • 同一个类中
  • 方法名相同,
  • **形参列表不同**。

什么时候发生子类方法和父类方法的重载

如果子类定义了一个与父类方法有相同的方法名,但参数列表不同的方法,就会形成父类方法和子类方法的重载,

参考资料

5.2.5 方法重载