5.6.2 重写父类的方法
5.6.2 重写父类的方法
子类扩展了父类,子类是一个特殊的父类。大部分时候,子类总是以父类为基础,额外增加新的成员变量和方法。但有一种情况例外:子类需要重写父类的方法。
方法重写
子类包含与父类同名方法的现象被称为方法重写(Override
),也被称为方法覆盖。可以说子类重写了父类的方法,也可以说子类覆盖了父类的方法
方法重写规则
方法的重写要遵循”两同两小一大”规则,
- “两同”即
- 方法名相同、
- 形参列表相同:
- “两小”指的是
- 子类方法返回值类型应比父类方法
返回值类型更小或相等
, - 子类方法声明抛出的异常类应比父类方法声明
抛出的异常类更小或相等
;
- 子类方法返回值类型应比父类方法
- “一大”指的是
- 子类方法的访问权限应比父类方法的
访问权限更大或相等
。
- 子类方法的访问权限应比父类方法的
尤其需要指出的是,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,个是实例方法。
子类 对象 无法访问被覆盖父类的方法
当子类覆盖了父类方法后,子类的对象
将无法访问父类中被覆盖的方法,
子类 方法 可以调用被覆盖的父类方法
虽然子类对象
无法调父类中被覆盖的方法,但可以在子类方法
中调用父类中被覆盖的方法。
子类方法 中如何调用被覆盖的父类方法
如果需要在子类方法
中调用父类中被覆盖的方法,
- 若被覆盖的是
实例方法
则可以使用super
作为调用者来调用父类中被覆盖的方法 - 若被覆盖的是
类方法
则可以使用父类类名
作为调用者来调用父类中被覆盖的方法
父类中private修饰的方法无法重写
如果父类方法具有private
访问权限,则该方法对其子类是隐藏的,因此其子类无法访问该方法,也就是无法重写该方法。
所谓重写父类private方法只不过是子类中定义的新方法,不算重写
如果子类中定义了一个与父类private
方法具有相同的方法名
、相同的形参列表
、相同的返回值类型的方法
,依然不是重写,只是在子类中重新定义了一个新方法。例如,下面代码是完全正确的
重载和重写的区别
方法重载和方法重写在英语中分别是overload
和override
,
其实把重载和重写放在一起比较本身没有太大的意义
- 因为
重载
主要发生在同一个类
的多个同名方法之间, - 而重写发生在
子类
和父类
的同名方法之间。
它们之间的联系很少,除二者都是发生在方法之间,并要求方法名相同之外,没有太大的相似之处。
父类方法和子类方法 可以重载
父类方法和子类方法之间也可能发生重载,因为子类会获得父类方法。
方法重写要求
- 方法名相同、
- 形参列表
相同
: - 返回值类型更小或相等
- 抛出的异常类更小或相等
- 访问权限更大或相等
方法重载的要求
方法重载的要求就是两同一不同
:
- 同一个类中
- 方法名相同,
- **形参列表
不同
**。
什么时候发生子类方法和父类方法的重载
如果子类定义了一个与父类方法有相同的方法名,但参数列表不同
的方法,就会形成父类方法和子类方法的重载,