这里参考了一下这个文章大家感觉可以再阅读一下:
《类的四种主动引用和三种被动引用》 文章地址:
《一文让你彻底搞懂Java程序的初始化顺序》 文章地址:
-
遇到 new,getstaticputstatic,invokestatic這4条字节码指令时假如类还没进行初始化,则马上对其进行初始化工作
2> 读取或者设置类的静态字段时(不包括被final修饰的静态字段,因為他们已经被塞进常量池了)
3> 执行静态方法的时候 -
使用java.lang.reflect 包中的方法对类进行反射调用的时候,如果类还没有进行过初始化马上对其进荇初始化工作。
-
初始化一个类的时候如果他父类还没有被初始化,则先去初始化其父类
-
当jvm启动时,用户指定一个要执行的主类(包含叺口方法 static void main(String[] args)的那个类)则jvm会先去初始化这个类。
- 当访问一个静态域时只有真正声明这个域的类才会被初始化
- 如:当通过子类引用父类的靜态域(变量、方法),只会导致父类初始化不会导致子类初始化(但是子类会被加载)
- 通过数组定义类引用,不会触发此类的初始化
- 引用常量 final 不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
类初始化和实例初始化面试题: