Java的类是用到才开始加载的,并且在每个类的构造器调用之前,类的每个域(成员变量)都要首先被编译器初始化一次,然后才轮到构造器来干活;

1、运行带mian方法的类的初始化:

  • 初始化静态变量、静态初始化块(类成员,static修饰);
  • 进入main方法体(本身是public  static修饰);
  • 执行main方法体;

如果:main方法体里,new本类,创建本类一个实例对象,则

  • 初始化:(非静态)成员变量、非静态初始化块
  • 进入构造器
  • 初始化结束

如果:main方法体,不new本类,执行后续代码直到退出

Java的惰性初始化,在main方法被调用之前无法知道是否存在主类的实例

2、带父类的类的初始化

1、从父类开始初始化(Object 类开始)

父类:初始化静态变量、静态初始化块

子类:初始化静态变量、静态初始化块

子类main(如果有的话)

父类:普通成员、初始化块

父类:构造器

子类:普通成员、初始化块

子类:构造器

进入当前类的构造器时,当前所在类的实例对象已经生成,不能显示访问,通过 this 指示当前类创建的实例;

可以通过this对普通成员变量进行自定义初始化;

构造器执行结束,返回当前类的对象引用this,回到new对象所在的语句:A a = new A();将this赋值给a,