JVM学习五:JVM之类加载器之编译常量和主动使用
在学习了前面几节的内容后,相信大家已经对JAVA 虚拟机 加载类的过程有了一个认识和了解,那么本节,我们就继续进一步巩固前面所学知识和特殊点。 一、类的初始化回顾 类在初始化的时候,静态变量的声明语句以及静态代码块都被看作类的初始化语句,Java虚拟机会按照初始化语句在类文件中的先后顺序来依次加载它们。 上图中a的初始化其实经过了四步 1、a被初始化为默认值0 2、a被赋予正确的初始值1 3、执行静态代码块,将a的值赋为2 4、执行静态代码块,将a的值赋为4 因此最终的执行结果是4,一个类只能被一个ClassLoader加载一次,只有没有被加载过的类或者已经被卸载的类才可能被再次加载。类的初始化步骤如下: 1、假如这个类还没有被加载和连接,那就先进行加载和连接 2、假如存在直接的父类,并且这个父类还没有被初始化则先初始化直接的父类 3、假如类中存在初始化语句,那就依次执行初始化语句。 注意:Java虚 拟机在初始化一个类的时候要求它的父类已经被初始化,但是这条规则并不适应于接口!在初始化一个类的时候并不会初始化他所实现的接口!在初始化一个接口的 时候也不会去初始化他的父接口!因此一个父接口并不会因为他的实现类或者子接口的初始化而初始化,只有当程序使用该接口特定的静态变量的时候才会去初始化 这个接口! 我们上面的例子印证了第三点,对于前两点我们知道我们构造一个类的时候假设它有父类