类在什么时候被初始化:
1)创建类的实例,也就是new一个对象时候
2)访问某个类或接口的静态变量,或者对该静态变量赋值
3)调用类的静态方法
4)反射
5)初始化一个类的子类(会首先初始化子类的父类)
6)JVM启动时候标明的启动类,即文件名和类名相同的那个类
类的初始化步骤:
1)如果这个类还没有被加载和链接,那先进行加载和链接
2)如果这个类存在直接父类,并且这个类还没有被初始化(注意一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)
3)加入类中存在初始化语句(如static变量和static块),那就一次执行这些初始化语句。
java程序初始化工作可以在许多不同的代码块中来完成(例如:静态代码块、构造函数等),他们执行的顺序如下:
- 父类静态变量
- 父类静态代码块
- 子类静态变量
- 子类静态代码块
- 父类非静态变量
- 父类非静态代码块
- 父类构造器
- 子类非静态变量
- 子类非静态代码块
- 子类构造器