原文作者:iceAeterna
原文链接:http://www.cnblogs.com/iceAeterNa/p/4876747.html
序言
Java虚拟机通过装载、连接、初始化来使得一个Java类型可以被Java程序所使用,如下图所示,其中连接过程又分为验证、准备、解析三个部分。其中部分类的解析过程可以推迟到程序真正使用其某个符号引用时再去解析。
解析
解析过程可以推迟到类的初始化之后再进行,但这是有条件的,Java虚拟机必须在每个类或接口主动使用时进行初始化。
以下为主动使用的情况:
- 创建某个类新的实例(无论直接通过new创建出来的,还是通过反射、克隆、序列化创建的)
- 使用某个类的静态方法
- 访问某个类或接口的静态字段
- 调用JavaAPI中的某些反射方法
- 初始化某个类的子类(要求其祖先类都要被初始化,否则无法正确访问其继承的成员)
- 启动某个标明为启动类的类(含有main()方法)
主动使用会导致类的初始化,其超类均将在该类的初始化之前被初始化,但通过子类访问父类的静态字段或方法时,对于子类(或子接口、接口的实现类)来说,这种访问就是被动访问,或者说访问了该类(接口)中的不在该类(接口)中声明的静态成员。