继承

面向对象第二大特征:继承

什么是继承?
什么是类与类之间的一种父子关系,Java中提供关键字extends,用于建立类与类之间的关系

继承的格式?
public class Student extends Person{}

继承的好处?

  • 可以把多个子类中重复的代码抽取到父类中,提高代码的复用性
  • 子类可以在父类的基础上增加其它的功能,使子类更强大

继承的特点

  1. Java只支持单继承,不支持多继承,但支持多层继承
    • 单继承:一个子类只能继承一个父类
    • 不能多继承:子类不能同时继承多个父类
  2. Java中的顶级父类为:Object,每一个类都直接或者间接的继承于Object

继承中的成员变量访问特点

先在局部位置找,本类成员位置找,父类成员位置找,逐级往上

this和super关键字

  • this关键字:从本类成员位置开始往上找
  • super关键字:从父类成员位置开始往上找

如果在继承中有多个重名变量,我们最多往上找到父类中的成员变量即super.变量名,无法再往上找,除非父类中没有重名变量super才会往上找,如果父类有重名变量,那最多就只能获取到父类中的重名变量

继承中的成员方法访问特点

  • 调用规则:遵守就近原则
  • 方法重写:在子类中,把父类的方法再重写一遍,方法申明保持一致,重写的方法上需要加@Override注解,校验重写的语法是否正确。
  • 使用场景:如果父类的方法不能满足子类的要求了,子类中可以把该方法再重写一遍
  • this调用:在本类构造方法里,调用本类的另一个构造方法
  1. 如果子类中有多个构造方法的时候,不能用this()互相调用,一定要预留一个调用父类的的构造方法。
  2. 如果构造方法当中写上了this(),就不能再写super,JVM也不会自动添加super()。
  3. 在老版本当中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修饰的方法不在虚方法表中,无法通过虚方法表传递给子类

posted @ 2026-04-22 13:46  AlexXuu  阅读(5)  评论(0)    收藏  举报