5.9.3 静态初始化块
如果定义初始化块时使用了static
修饰符,则这个初始化块就变成了静态初始化块,也被称为类初始化块
(普通初始化块负责对对象执行初始化,类初始化块则负责对类进行初始化
)。静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行。因此静态初始化块总是比普通初始化块先执行
。
静态初始化块不能访问实例变量实例方法
静态初始化块是类相关的,用于对整个类进行初始化处理,通常用于对类变量执行初始化处理。静态初始化块不能对实例变量进行初始化处理。
静态成员不能访问非静态成员
静态初始化块也被称为类初始化块,也属于类的静态成员,同样需要遵循静态成员不能访问非静态成员的规则,因此静态初始化块不能访问非静态成员,包括不能访问实例变量和实例方法。
先执行父类静态初始化块 再执行子类静态初始块
与普通初始化块类似的是,系统在类初始化阶段执行静态初始化块时,不仅会执行本类的静态初始化块,而且还会一直上溯到java.lang.Object
类(如果它包含静态初始化块),先执行java.lang.Object
类的静态初始化块(如果有),然后执行其父类的静态初始化块,依次类推,最后才执行该类的静态初始化块,经过这个过程,才完成了该类的初始化过程。
所以有静态初始块执行完毕后才可以创建对象
只有当类初始化
完成后,才可以在系统中使用这个类,包括访问这个类的类方法
、类变量
或者用这个类来创建实例
。
先进行类初始化 然后再执行对象初始化
普通初始化块和构造器的执行顺序与前面介绍的一致,每次创建一个对象时,都需要先执行最顶层父类的初始化块、构造器,然后执行其父类的初始化块、构造器。
静态初始化块和静态成员变量初始化按出现顺序执行
静态初始化块
和声明静态成员变量时所指定的初始值都是该类的初始化代码,它们的执行顺序与源程序中的排列顺序相同。
当JVM
第一次主动使用某个类时,系统会在类准备阶段
为该类的所有静态成员变量分配内存;在初始化阶段
则负责初始化这些静态成员变量,初始化静态成员变量就是执行类初始化代码块
或者声明类成员变量时指定的初始值,它们的执行顺序与源代码中的排列顺序相同
类初始化只执行一次
类初始化代码块和静态成员变量初始化只会在类初始化阶段执行一次.
原文链接: 5.9.3 静态初始化块