类型的装载、连接和初始化
装载:把二进制形式的java类型读入java虚拟机中
连接:把已经读入虚拟机的二进制形式的数据合并到虚拟机运行时的状态中去。连接分为三个状态
1.验证 2.准备 3.解析
初始化:在此期间都给类变量赋以适当的初始值
上述三个阶段必须严格按照时序进行,唯一有区别的是,在连接的解析阶段,可以在初始化之后进行
在类和接口被装载和连接的时机上,java虚拟机规范给出了具体实习提供了一定的灵活性。但严格定义了初始化的时机。所有的java虚拟机必须在每个类或接口首次主动使用时进行初始化。符合主动使用的6种情况:
1)当创建某个类的新实例,或者通过在字节码中执行new指令,或者通过不明确的创建、反射、克隆、或者反序列化
2)当某个类使用静态方法时
3)当使用某个类或者接口的静态字段,或者对该字段进行赋值。除了用final声明的静态字段外
4)当调用Java API的某些反射方法时,比如,Class中的方法或者java.lang.reflect包中的方法
5)当初始化某个类的子类时,即当初始化某个类时,要求它的超类已经被初始化了。
6)当虚拟机启动时某个被表明为启动类的类,即含有main()的类
接口与超类的区别:子类在初始化前超类必须已经初始化完成,而接口并不是这样实现的。只有当接口的非常量字段被使用时才会对接口初始化。
在类被初始化之前必须已经装载、连接完成。java虚拟机可以提前进行加载、连接,而不是等到需要使用时在进行上面两条操作。无论如何,如果一个类在主动使用前还没被装载和连接,那么它现在必须此刻进行装载和连接才能被初始化。