本文转载自: https://www.cnblogs.com/caolaoshi/p/7824748.html
static{}块,会且仅会在类被加载时执行一次,多用于定义静态变量或执行静态方法。
什么是类加载?即JAVA虚拟机通过输入流将磁盘中的字节码(.class)文件读入虚拟机并保存起来的过程,在一个生命周期中一个类只被加载一次。
这并不意味着会立马加载,原则是延迟记载,能少加载就少加载,尽量减少虚拟机空间的使用。
加载时机:
1.第一次创建此类对象
2.调用此类静态方法或访问静态属性
3.加载此类的子类
4.创建对象引用不加载类
5.子类调用父类的静态方法时
(1)当子类没有覆盖父类的静态方法时,只加载父类,不加载子类
(2)当子类有覆盖父类的静态方法时,既加载父类,又加载子类
6.访问静态常量,如果编译器可以计算出常量的值,则不会加载类,例如:public static final int a =123;否则会加载类,例如:public static final int a = math.PI