【深入java虚拟机(3)】:类初始化-编程开发技术

【深入java虚拟机(3)】:类初始化-编程开发技术

ID:30978820

大小:70.00 KB

页数:3页

时间:2019-01-05

【深入java虚拟机(3)】:类初始化-编程开发技术_第1页
【深入java虚拟机(3)】:类初始化-编程开发技术_第2页
【深入java虚拟机(3)】:类初始化-编程开发技术_第3页
资源描述:

《【深入java虚拟机(3)】:类初始化-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、【深入Java虚拟机(3)]:类初始化-编程开发技术【深入Java虚拟机(3)】:类初始化原文出处:兰亭风雨类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码。虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化:•遇到new、getstatic>putstatic>invokestatic这四条7节码指令时,如果类还没冇进行过初始化,则需要先触发其初始化。生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象吋、读取或设置一•个类的静态字段(static)吋(被static修饰乂被final修饰的,己在编译期把结果放入常量

2、池的静态字段除外)、以及调用一个类的静态方法时。•使用Javadang.refect包的方法对类进行反射调用时,如果类还没冇进行过初始化,则需要先触发其初始化。•当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。•当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先执行该主类。虚拟机规定只有这四种情况才会触发类的初始化,称为对一个类进行主动引用,除此之外所有引用类的方式都不会触发其初始化,称为被动引用。下面举一些例子來说明被动引用。1、通过了类引用父类中的静态字段,这时对了类的引用为被动引用,因此不会初始化子类,只会初始化父类classFath

3、er{publicstaticintm=33;static{System,out.printin(,z父类被初始化〃);}}classChildextendsFather{static{System,out.printin(z,子类被初始化〃);}}publicclassStaticTcst{publicstaticvoidmain(String[]args){System.out.println(Child.m);执行后输岀的结果如下:父类被初始化33对于静态字段,只有直接定义这个字段的类才会被初始化,因此,通过其子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子

4、类的初始化。2、常量在编译阶段会存入调用它的类的常量池中,木质上没有一直接引用到定义该常量的类,因此不会触发定义常量的类的初始化classConst{publicstaticfinalStringNAME=〃我是常量〃;static{System,out.printin(〃初始化Const类〃);}}publicclassFinalTest{publicstaticvoidmain(String[]args){System,out.printin(Const.NAME);}}执行后输出的结果如下:我是常量虽然程序屮引用了const类的常量NAME,但是在编译阶段将此常量的值“我是

5、常量”存储到了调用它的类FinalTest的常量池中,对常量Const.NAME的引用实际上转化为了FinalTest类对口身常量池的引用。也就是说,实际上FinalTest的Class文件Z屮并没冇Const类的符号引用入口,这两个类在编译成Class文件后就不存在任何联系了。3、通过数组定义来引用类,不会触发类的初始化classConst{static{System,out.printin(,z初始化Const类〃);publicclassArrayTest{publicstaticvoidmain(String[]args){Const[]con二newConst[5];执

6、行后不输岀任何信息,说明Const类并没有被初始化。但这段代码里触发了另一个名为“LLConst”的类的初始化,它是一个由虚拟机自动生成的、直接继承于java.lang.Object的子类,创建动作由字节码指令newarray触发,很明显,这是一个对数组引用类型的初初始化,而该数组中的元素仅仅包含一个对Const类的引用,并没有对其进行初始化。如果我们加入对con数组屮各个Const类元素的实例化代码,便会触发Const类的初始化,如下:classConst{static{System,out.printl初始化Const类〃);publicclassArrayTest{publ

7、icstaticvoidmain(String[]args){Const[]con二newConst[5];for(Consta:con)a=newConst();}}这样便会得到如下输出结果:初始化Const类根据四条规则的第一条,这里的new触发了Const类。最后看一下接口的初始化过程与类初始化过程的不同。接口也有初始化过程,上面的代码中我们都是用静态语句块来输岀初始化信息的,而在接口中不能使用“stdtic{}”语句块,但编译器仍然会为接口生成类构造器,用

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。