java的类加载机制
1、类的加载、连接、与初始化
- 加载:在硬盘上查找,并加载累的二进制数据进内存
类加载是指将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据。
- 连接
-验证:确保被加载类的正确性
-准备:为类的静态变量分配内存,并将其初始化为默认值
-解析:把类中的符号引用转换为直接引用
- 初始化:为类的静态变量赋正确的初始值、
类的初始化时机:
- 主动使用:
- 创建类的实例
- 访问某个类的活接口的金泰变量,或者对静态变量赋值
- 调用类的静态方法
- 反射,如:class.forName()
- 初始化一个类的子类
- java虚拟机启动时被标明为启动类的类
- 初始化步骤
- 加入这个类还没有被加载和连接,那就先进行加载和连接
- 假如类存在直接的父类,并且这个父类还没有被初始化,那就先初始化直接的父类
- 假如勒种存在初始化语句,那就一次执行这些语句(从上到下,如static{}
- 除了上述六种情况,其他使用Java类的方式都看看做是被动使用,不会导致类的初始化 。
- 当java虚拟机初始化一个类时,要求它的所有父类都已经被初始化,但是这条规则并不适用于接口。
- 在初始化一个类时,并不会先初始化他所实现的接口。
- 在初始化一个接口时,并不会先初始化它的父接口。
因此,一个负借口并不会以为它的子接口或者实现类的初始化而初始化,只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。
附文:http://hxraid.iteye.com/blog/747625