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,