解析java虚拟机中类的初始化及加载器的父委托机制

解析java虚拟机中类的初始化及加载器的父委托机制

ID:30902454

大小:235.02 KB

页数:14页

时间:2019-01-04

解析java虚拟机中类的初始化及加载器的父委托机制_第1页
解析java虚拟机中类的初始化及加载器的父委托机制_第2页
解析java虚拟机中类的初始化及加载器的父委托机制_第3页
解析java虚拟机中类的初始化及加载器的父委托机制_第4页
解析java虚拟机中类的初始化及加载器的父委托机制_第5页
解析java虚拟机中类的初始化及加载器的父委托机制_第6页
解析java虚拟机中类的初始化及加载器的父委托机制_第7页
解析java虚拟机中类的初始化及加载器的父委托机制_第8页
解析java虚拟机中类的初始化及加载器的父委托机制_第9页
解析java虚拟机中类的初始化及加载器的父委托机制_第10页
资源描述:

《解析java虚拟机中类的初始化及加载器的父委托机制》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、解析Java虚拟机中类的初始化及加载器的父委托机制这篇文章主要介绍了Java虚拟机中类的初始化及加载器的父委托机制,包括命名空间等深层次的知识点讲解,需要的朋友可以参考下连接验证加载准备►初始化解析类的初始化在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值。在程序中,都态变量的初始化有两种途径:1•在静态变量的声明处进行初始化;2•在静态代码块中进行初始化。没有经过显式初始化的静态变戢将原有的值。一个比较奇怪的例子:packagecom.mengdd.classloader;classSin

2、gleton{//privatestaticSingletonmlnstance=newSingleton();〃位置1//位置1输出://counterl:1//counter2:0publicstaticintcounterl;publicstaticintcounter2=0;privatestaticSingletonmlnstance=newSingleton();〃位置2//位置2输出://counterl:1//counter2:1privateSingleton(){counterl++;count

3、er2++;}publicstaticSingletongetlnstantce(){returnmlnstanee;publicclassTesti{publicstaticvoidmain(String[]args){Singletonsingleton=Singleton.getlnstantce();System.out.println(ncounterl:H+Singleton.counterl);System.out.println(”counter2:"+Singleton.counter2);}}可

4、见将生成对象的语句放在两个位置,输出是不一样的(相应位置的输出己在程序注释中标明)。这是因为初始化语句是按照顺序来执行的。静态变量的声明语句,以及静态代码块都被看做类的初始化语句,Java虚拟机会按照初始化语句在类文件中的先后顺序來依次执行它们。类的初始化步骤1•假如这个类还没有被加载和连接,那就先进行加载和连接。2.假如类存在直接的父类,并这个父类还没冇被初始化,那就先初始化直接的父类。3.假如类屮存在初始化语句,那就依次执行这些初始化语句。类的初始化时机Java程序对类的使用方式可以分为两种:1.主动使用1.被

5、动使用所冇的Java虚拟机实现必须在每个类或接口被Java程序首次主动使用时才初始化它们。主动使用的六种情况:1.创建类的实例。newTest();2.访问某个类或接口的静态变量,或者对该静态变量赋值。intb=Test.a;Test.a=b;3.调用类的静态方法Test.doSomething();4仮射Class.forName(/zcom.mengdd.Test");5•初始化一个类的了类classParent{}classChildextendsParent{publicstaticinta=3;}Chil

6、d.a=4;6Java虚拟机启动时被标明为启动类的类javacom.mengdd.Test除了以上六种情况,其他使用Java类的方式都被看作是对类的被动使用,都不会导致类的初始化。接口的特殊性当Java虚拟机初始化一个类时,要求它的所冇父类都己经被初始化,但是这条规则并不适用于接口。在初始化一个类时,并不会先初始化它所实现的接口。在初始化一个接口时,并不会先初始化它的父接口。因此,-•个父接口并不会因为它的子接口或者实现类的初始化而初始化,只有当程序首次使用特定接口的静态变彊时,才会导致该接口的初始化。final类

7、型的静态变量final类型的静态变量是编译时常量还是变量,会影响初始化语句块的执行。如果一个静态变量的值是一个编译时的常量,就不会对类型进行初始化(类的static块不执行):如果一个静态变量的值是一个非编译时的常量,即只冇运行时会冇确定的初始化值,则就会对这个类型进行初始化(类的static块执行)。例子代码:packagecom.mengdd.classloader;importjava.util.Random;classFinalTestl{publicstaticfinalintx=6/3;//编译时期已经

8、可知其值为2,是常量//类型不需耍进行初始化static{System.out.println(HstaticblockinFinalTestl");//此段语句不会被执行,即无输出}}classFinalTest2{static{System.out.println(HstaticblockinFinalTest2u);//会进行类的初始化,即静态语句块会

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

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

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