加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

JVM 理解其实并不难!

发布时间:2019-03-17 08:42:33 所属栏目:站长百科 来源:javaspring思维导图
导读:副标题#e# 前些天面试了阿里的实习生,问到关于Dalvik虚拟机能不能执行class文件,我当时的回答是不能,但是它执行的是class转换的dex文件。当面试官继续问,为什么不能执行class文件时,我却只能回答Dalvik虚拟机内部的优化原因,却不能正确回答具体的原因

5.但是用JDK1.7启的动态语言支持时,如果一个MethodHandle实例最后解析的结果是REF_getStatic、REF_putStatic、Ref_invokeStatic的方法句柄时,并且这个方法句柄所对应的类没有进行初始化,则要先触发其初始化。

另外要注意的是:通过子类来引用父类的静态字段,不会导致子类初始化:

  1. public class SuperClass{ 
  2. public static int value=123; 
  3. static{ 
  4. System.out.printLn("SuperClass init!"); 
  5. public class SubClass extends SuperClass{ 
  6. static{ 
  7. System.out.println("SubClass init!"); 
  8. public class Test{ 
  9. public static void main(String[] args){ 
  10. System.out.println(SubClass.value); 

最后只会打印:SuperClass init!

对应静态变量,只有直接定义这个字段的类才会被初始化,因此通过子类类引用父类中定义的静态变量只会触发父类初始化而不会触发子类初始化。

通过数组定义来引用类,不会触发此类的初始化:

  1. public class Test{ 
  2. public static void main(String[] args){ 
  3. SuperClass[] sca=new SuperClass[10]; 

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读