继承

  • 子类继承父类的特征和⾏为,使得⼦类对象具有父类的方法和属性
  • 父类也叫基类,具有公共的⽅法和属性,⽣活中的例子
    • 动物<-猫
    • 动物<-狗
  • java中的继承,减少重复代码

    extends关键字

    1. class ⽗类名称{
    2. }
    3. class ⼦类名称 extends ⽗类名称{
    4. }
  • 特点

  • 子类拥有父类的非private的属性和⽅法
  • ⼦类可以⽤自己的方式实现父类的方法 override(重写,覆盖)
  • 实现了代码的复⽤
  • 重写从⽗类那里继承来的方法的,当调⽤方法时候会优先调⽤子类的⽅方法(默认就近原则)

    注意

  • 不支持多继承,⽀持多重继承,多重继承提高了耦合性,组合优于继承

  • 所有的类都是继承于 java.lang.Object
  • final关键字
    • 修饰的类,则这个类不可以被继承
    • 修饰⽅法,则这个⽅法不允许被覆盖(重写)

image.png
image.png

  • after

image.png
image.png
image.png

  • 重写父类方法

image.png
image.png
image.png

super关键字

  • 一个引⽤变量,⽤于引用父类对象
  • 父类和子类都具有相同的命名方法,要调⽤⽗类方法时使用
  • 父类和子类都具有相同的命名属性,要调⽤父类中的属性时使用
  • super也是父类的构造函数,格式 super(参数)

    • 调⽤super() 必须是类构造函数中的第⼀条语句,否则编译不通过

      注意

  • 每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错

  • this()和super()都指的是对象,均不可以在static环境中使用

    • 包括:static变量,static方法,static语句句块。
      1. public class Father {
      2. public Father(){
      3. System.out.println("father ⽆无参构造函数");
      4. }
      5. }
      6. class Children extends Father{
      7. public Children(){
      8. //默认存在,写和不不写都⾏行行
      9. super();
      10. System.out.println("Child⽆无参构造函数");
      11. }
      12. }
  • 普通继承

image.png
image.png

  • super继承

image.png
image.png

  • 隐式super继承

image.png

  • 父类构造函数有参,子类构造函数无参,报错
  • 父类有参构造会覆盖默认无参构造函数,而子类是无参构造函数,对应的父类没有这种形式的构造函数,那么在编译的时候就会报错

image.png

构造函数 super和this

  • this 和super在构造函数中只能有⼀个,且都必须是构造函数当中的第⼀行
  • 当父类的构造函数是⽆参构造函数时,在子类的构造函数中,不用显式super()去调用⽗类的构造函数,
  • 当⽗类的构造函数是有参构造函数时,如果子类的构造函数中不写super()进行调用⽗父类的构造函数,编译器会报错

image.png

java继承后类的初始化顺序

  • 静态代码块、⾮静态代码、⽗类/子类无参构造方法、父类/子类的一般⽅法
    1. public class Father {
    2. static {
    3. System.out.println("⽗父类静态代码块");
    4. }
    5. public Father(){
    6. System.out.println("father ⽆无参构造函数");
    7. }
    8. public Father(int age){
    9. System.out.println("father 有参构造函数");
    10. }
    11. public void sleep(){
    12. System.out.println("father sleep⽅方法");
    13. }
    14. }
    15. public class Children extends Father{
    16. static {
    17. System.out.println("Child静态代码块");
    18. }
    19. public Children(){
    20. //super();
    21. System.out.println("Child⽆无参构造函数");
    22. super.sleep();
    23. }
    24. public void sleep(){
    25. System.out.println("Child sleep⽅方法");
    26. }
    27. }
    28. public static void main(String[] args) {
    29. new Children().sleep();
    30. }