Java super关键字 解析

170 阅读1分钟
  • super 表示父类对象的引用
public class Person{
  // 父类的构造方法无法被继承 无法被重写
  public Person(){}

  public void eat(){
      System.out.println("person eat");
  }
}

public class Man extends Person{
  public Man(){
    super();
  }

  @override
  public void eat(){
    // 表示先调用父类的eat()方法
    super.eat();
    System.out.println("man eat");
   }
}

子类实例化过程解析

  • new Man()
  • ClassLoader加载类的信息
  • 进入父类Person类
  • 加载父类的静态成员(顺序和书写位置有关)
  • 进入子类Man类
  • 加载子类的静态成员
  • 调用子类构造方法(并不会执行构造方法)
  • 往上寻找父类的构造方法直到最顶级的父类为止 但并不会执行构造方法
  • 实例化父类属性的赋值操作
  • 执行父类的构造代码块
  • 执行父类的构造方法
  • 实例化子类的属性
  • 执行子类的构造代码块
  • 执行子类的构造方法

总结

子类实例化 -》( 父类静态成员 -> 子类静态成员 -> 父类对象构造 -> 子类对象构造)

子类实例化过程构造方法调用流程

  • 子类构造过程中必须调用父类的构造方法
  • 子类实例化在没有显式调用父类的构造方法前提下 无论调用哪个构造方法 都会进入到父类的无参构造方法
  • 构造方法的调用必须放在构造方法里
  • super()/this() 调用构造方法必须放在第一行