9 继承
9.1 概述
- 什么是继承
Java 中提供了一个关键字 extends,可以让两个类中间建立继承关系。
public class Student extends Person{}Student 称为子类,Person 称为父类(基类或超类)。
- 继承的优点
将多个子类的重复代码抽取到父类,提高代码复用性。
子类可以在父类基础上增加其他功能,使子类更强大。
什么时候使用继承
类与类之间存在相同的内容
子类是父类中的一种
特点
只支持单继承:一个类只能继承一个直接父类(爷爷类称为间接父类)。
支持多层继承
Java 中所有类都直接或间接继承于 Object 类
子类只能访问父类中非私有成员
9.2 继承内容
| 成员 | 分类 | 能否继承 |
|---|---|---|
| 构造方法 | private | × |
| 构造方法 | 非 private | × |
| 成员变量 | private | √ |
| 成员变量 | 非 private | √ |
| 成员方法 | 非虚方法 | × |
| 成员方法 | 虚方法 | √ |
虚方法:非 private、非 static、非 final 修饰的成员方法。
父类会将自己的虚方法记录到虚方法表中。
子类会从父类中拷贝一份虚方法表,并在表中添加自己的虚方法。
9.3 访问特点
9.3.1 成员变量
就近原则:先在局部位置找,再在本类位置找,最后在父类位置找,逐级向上。
重名时,使用 value 从局部开始找,this.value 从本类开始找,super.value 从父类开始找。
9.3.2 成员方法
this 调用:就近原则。
super 调用:直接找父类。
方法的重写:当父类方法不能满足子类需求时,需要重写方法。
格式:方法名和形参列表与父类方法相同,添加 @Override 注解(检查重写是否正确,同时可读性好)。
要求:重写方法尽量与父类保持一致;只有虚方法表中的方法才能被重写。
本质:覆盖了虚方法表中的方法。
9.3.3 构造方法
父类的构造方法不会被子类继承。
子类的所有构造方法默认先调用父类的无参构造,再执行自己(对父类的数据空间进行初始化)。
调用
子类构造方法的方法体中第一行默认语句是
super();,不写也存在,且必须在第一行。若要调用父类有参构造必须手动写 super 进行构造,调用方法
super(paraList);。