java虚拟机类加载机制——案例分析-java开发java经验技巧

java虚拟机类加载机制——案例分析-java开发java经验技巧

ID:31191928

大小:68.50 KB

页数:3页

时间:2019-01-07

java虚拟机类加载机制——案例分析-java开发java经验技巧_第1页
java虚拟机类加载机制——案例分析-java开发java经验技巧_第2页
java虚拟机类加载机制——案例分析-java开发java经验技巧_第3页
资源描述:

《java虚拟机类加载机制——案例分析-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、hva虚拟机类加载机制——案例分析・编程开发技术Java虚拟机类加载机制案例分析原文出处:朱小厮在《Java虚拟机类加载机制》一文中详细阐述了类加载的过程,并举了几个例了进行了简要分析,在文章的最后留了一个悬念给各位,这里來揭开这个悬念。建议先看完《Java虚拟机类加载机制》这篇再来看这个,印象会比较深刻,如若不然,也没什么关系~~下面是程序代码:packagejvm.classload;publicclassStaticTest{publicstaticvoidmain(String[]args){staticF

2、unction();}staticStaticTestst二newStaticTest();static{System.out.printin(〃1〃);}{System.out・println("2");}StaticTest(){System.out・println("3");System.out.println(〃a二〃+a+",b二〃+b);}publicstaticvoidstaticFunction(){System.out・println("4");}inta=110;staticintb=112;问

3、题是:请问这段程序的输出是什么?这个是我在论坛上看到的一个问题,我觉得比较金典。一般对于这类问题,小伙伴们脑海中肯定浮现川I这样的knowledge:Java中赋值顺序:?1.父类的静态变量赋值?2.自身的静态变量赋值?3.父类成员变量赋值?4.父类块赋值?5.父类构造函数赋值?6.口身成员变量赋值?7.自身块赋值?8.口身构造函数赋值ok,按照这个理论输出是什么呢?答案输出:14,这样正确嚨?肯定不正确啦,这里不是说上面的规则不正确,而是说不能简单的套用这个规则。止确的答案是:23a二110,b=014是不是有点

4、不可思议?口听我一一道来,这里主要的点之一:实例初始化不一定要在类初始化结束之后才开始初始化。类的生命周期是:加载->验证-〉准备->解析-〉初始化-〉使用-〉卸载,只有在准备阶段和初始化阶段才会涉及类变量的初始化和赋值,因此只针对这两个阶段进行分析;类的准备阶段需要做是为类变量分配内存并设置默认值,因此类变量st为null,b为0;(需要注意的是如果类变量是final,编译时javac将会为value生成ConstantValue属性,在准备阶段虚拟机就会根据ConstantValue的设置将变量设置为指定的值,

5、如果这里这么定义:static?final?intb=112,那么在准备阶段b的值就是112,而不再是0了。)类的初始化阶段需要做是执行类构造器(类构造器是编译器收集所冇静态语句块和类变量的赋值语句按语句在源码中的顺序合并牛成类构造器,对彖的构造方法是<init>(),类的构造方法是<clinit>(),可以在堆栈信息屮看到),因此先执彳亍第一条静态变量的赋值语句即st二newStaticTest(),此时会进行对象的初始化,对象的初始化是先初始化成员变量再执行构造方法,因此打卬2-〉设置a为110-〉执行构造方法

6、(打印3,此时a已经赋值为110,但是b只是设置了默认值0,并未完成赋值动作),等对彖的初始化完成后继续执行之前的类构造器的语句,接下来就不详细说了,按照语句在源码中的顺序执行即可。这里面还牵涉到一个冷知识,就是在嵌套初始化时冇一个特别的逻辑。特别是内嵌的这个变量恰好是个静态成员,而月.是本类的实例。这会导致一个有趣的现彖:“实例初始化竟然出现在静态初始化之前”。其实并没有提前,你要知道java记录初始化与否的吋机。看一个简化的代码,把关键问题解释清楚:publicclassTcst{publicstaticvoi

7、dmain(String[]args){func();}staticTestst二newTest();staticvoidfunc(){}}根据上面的代码,有以下步骤:1.首先在执行此段代码时,首先IIImain方法的调用触发静态初始化。2.在初始化Test类的静态部分时,遇到st这个成员。3.但凑巧这个变罐引用的是木类的实例。4.那么问题來了,此时静态初始化过程还没完成就要初始化实例部分了。是这样么?5.从人的角度是的。但从jaw的角度,一旦开始初始化静态部分,无论是否完成,后续都不会再重新触发静态初始化流程了。

8、6.因此在实例化st变量时,实际上是把实例初始化嵌入到了静态初始化流程屮,并且在楼主的问题屮,嵌入到了静态初始化的起始位置。这就导致了实例初始化完全至于静态初始化Z前。这也是导致a冇值b没值的原因。7.最后再考虑到文本顺序,结果就显而易见了。详细看到这里,心中大概有个结论了吧,如果对于类的加载机制比较模糊的话,可以参考开篇推荐的博文~有问题欢迎留言。

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

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

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