继承
什么是继承?
- Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系(子类extends父类,子类更强大)
- 子类(派生类)、父类(基类或超类)
- 子类可以直接使用父类公共的属性和方法
好处:提高代码的复用性
继承设计规范
- 子类们相同特征放在父类中定义,子类独有的属性和行为应该定义在子类自己里面
- 因为如果子类的独有属性、行为定义在父类中,会导致其它子类也会得到这些属性和行为,这不符合面向对象逻辑
内存图
创建子类对象时,在堆内存中开辟的对象空间包括:子类空间(this)和父类空间(super)
继承的特点
- 子类可以继承父类的属性和行为,但是子类不能继承父类的构造器
- Java是单继承模式,一个类只能继承一个直接父类
- Java不支持多继承,但是支持多层继承
- Java中所有的类都是Object类的子类
- 对于多层继承,出现相同的方法(当内容有出入),子类继承就近的方法
私有、静态成员继承有争议,自己可以看看别人的文章,看看自己更偏向于哪种解释
继承后,成员变量、方法的访问特点
就近原则
- 先子类局部范围找
- 然后子类成员范围找
- 然后父类成员范围找,如果父类范围还没找到则报错
- 如果子父类中,出现了重名成员,会优先使用子类的,如果一定要在子类中使用父类的,可以用super.成员变量/成员方法
方法重写
- 在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类的这个方法是重写的方法
- 应用场景:子类需要父类功能,但该功能不能完全满足自己的要求时
@Override重写注解
- @Override是放在重写后的方法上,作为重写是否正确的校验注解, 加上该注解后如果重写错误,编译阶段会出现错误提示
- 提高程序的可读性,代码优雅
重写注意事项
(声明不变重新实现)
- 重写方法的名称、形参列表必须和被重写方法的一模一样
- 私有方法不能被重写
- 子类重写父类方法时,访问权限必须大于或者等于父类(缺省<protected<public)
- 不能重写静态方法,如果重写会报错
子类继承父类后构造器的特点
- 子类中所有的构造器默认都会先访问父类中无参的构造器,再执行自己(子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类无法使用父类的数据)
- 子类初始化之前,一定要调用父类构造器完成父类数据空间的初始化
- 子类构造器的第一行语句默认都是:super();不写也存在
如果父类中没有无参数构造器,只有有参构造器,会怎么样?
子类会报错
解决:子类构造器中可以通过书写super(……)(填对应构造器的参数),手动调用父类的有参数构造器