继承
面向对象第二大特征:继承
什么是继承?
什么是类与类之间的一种父子关系,Java中提供关键字extends,用于建立类与类之间的关系
继承的格式?
public class Student extends Person{}
继承的好处?
- 可以把多个子类中重复的代码抽取到父类中,提高代码的复用性
- 子类可以在父类的基础上增加其它的功能,使子类更强大
继承的特点
- Java只支持单继承,不支持多继承,但支持多层继承
- 单继承:一个子类只能继承一个父类
- 不能多继承:子类不能同时继承多个父类
- Java中的顶级父类为:Object,每一个类都直接或者间接的继承于Object
继承中的成员变量访问特点
先在局部位置找,本类成员位置找,父类成员位置找,逐级往上
this和super关键字
- this关键字:从本类成员位置开始往上找
- super关键字:从父类成员位置开始往上找
如果在继承中有多个重名变量,我们最多往上找到父类中的成员变量即super.变量名,无法再往上找,除非父类中没有重名变量super才会往上找,如果父类有重名变量,那最多就只能获取到父类中的重名变量
继承中的成员方法访问特点
- 调用规则:遵守就近原则
- 方法重写:在子类中,把父类的方法再重写一遍,方法申明保持一致,重写的方法上需要加@Override注解,校验重写的语法是否正确。
- 使用场景:如果父类的方法不能满足子类的要求了,子类中可以把该方法再重写一遍
- this调用:在本类构造方法里,调用本类的另一个构造方法
- 如果子类中有多个构造方法的时候,不能用this()互相调用,一定要预留一个调用父类的的构造方法。
- 如果构造方法当中写上了this(),就不能再写super,JVM也不会自动添加super()。
- 在老版本当中this()只能写在构造方法的第一行,但是在新版本当中去掉了这一限制。
4.目的:代码复用,不用重复写赋值逻辑
- super调用:直接访问父类
- 子类不能继承父类的构造方法,但是可以通过super调用
- 子类构造方法的第一行,有一个默认的super(),不写也有
- 如果想要访问父类有参构造,必须手动书写super(参数)
- super必须写在构造方法第一行,先执行父类的构造,再执行子类的构造
在最新的JDK版本中可以打破这个规则,但是我们还是遵循以前的书写规范,保持先有父类再有子类的逻辑
方法重写注意事项:
- final修饰变量、修饰类、修饰方法
- final修饰类:这个类就是最终类,不能被继承
- final修饰方法:这个方法就是最终的方法,不能被子类重写
父类中的private私有方法,static静态方法(所有类共享),final最终方法不能被继承重写
继承的内存结构/字节码文件详解
子类真正能继承父类的是什么?
- 构造方法:不能被子类继承,可以利用super关键字调用
- 成员变量:可以被子类继承,private私有的也可以,但是无法直接调用,需要通过get和set方法间接调用
- 成员方法:
虚方法(非static、final、private的普通方法)可以被继承
final修饰的最终方法不能被继承,可以被调用,编译器确定位置,运行时直接调用
static修饰的静态方法不能被继承,可以被调用,编译器修改为类名调用,运行时直接调用
private修饰的私有方法不能被继承,不能被调用
方法重写:子类替换虚方法表里面的地址值
private不能被子类继承的底层原理是private修饰的方法不在虚方法表中,无法通过虚方法表传递给子类
浙公网安备 33010602011771号