如何理解JavaJVM虚拟机中init和clinit的区别
如何理解Java JVM虚拟机中init和clinit的区别,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
创新互联-专业网站定制、快速模板网站建设、高性价比滨海新区网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式滨海新区网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖滨海新区地区。费用合理售后完善,十载实体公司更值得信赖。
public class Test1 {
static int x = 1;
public static void main(String[] args) throws Exception {
}
}
public class Test2 {
static final int x = 1;
public static void main(String[] args) throws Exception {
}
}
Test1类中有
public class Test{
static{
i=0;//给变量赋值可以正常编译通过
System.out.print(i);//这句编译器会提示"非法向前引用"
}
static int i=1;
}
虚拟机JVM会保证在子类的
static class Parent{
public static int A=1;
static{
A=2;
}
static class Sub extends Parent{
public static int B = A;
}
public static void main(String[] args){
System.out.println(Sub.B);
}
}
注意:接口中属性都是static final类型的常量,在准备阶段就已经初始化完成了。
接口中不能使用静态语句块,但仍然有变量初始化的赋值操作,因此接口与类一样都会生成
JVM类加载原理
1)类的生命周期包括了:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)七个阶段
2)当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。
3)加载阶段:通过一个类的全限定名来获取此类的二进制字节流;将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口;
4)验证阶段:验证是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全;包括文件格式验证、元数据验证、字节码验证、符号引用验证;如果验证到输入的字节流不符合Class文件的存储格式,就抛出一个java.lang.VerifyError异常或其子类异常。
5)准备阶段:准备阶段是正式为类变量分配内存并设置类变量初始值(各数据类型的零值)的阶段,这些内存将在方法区中进行分配。
6) 解析阶段:解析阶段是在虚拟机将常量池内的符号引用替换为直接引用的过程。符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。直接引用:直接引用可以是直接指向目标的指针、相对偏移量或者一个能间接定位到目标的句柄。如果有了直接引用,那引用的目标必定已经在内存中存在。
7)初始化阶段:初始化阶段是执行类构造器
初始化是重点,需要清楚以下几点:
1)
2) 方法与实例构造器
3)
4)执行接口的
5)虚拟机会保证一个类的
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。
当前标题:如何理解JavaJVM虚拟机中init和clinit的区别
文章位置:http://hbruida.cn/article/ppdohi.html