欢迎来到天天文库
浏览记录
ID:2018176
大小:32.50 KB
页数:2页
时间:2017-11-14
《java虚拟机 类初始化 阶段》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Java虚拟机类初始化阶段 在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请登陆疯狂java官网。 Java虚拟机使用某个类的过程,可分为七个阶段: 加载-验证-准备-解析-初始化-使用-卸载 本文只介绍在什么情况下对类进行初始化。 Java虚拟机规范对何时进行类的初始化做了严格规范,有且只有四种情况: 1.虚拟机启动时,指定的主类。 包含main方法的类。 2.遇到new、getstatic、putstatic、invokestatic四条指令时。 new
2、:使用new关键字实例化对象。 getstatic:读引用一个类的静态字段。 putstatic:写引用一个类的静态字段。 invokestatic:调用一个类的静态方法。 3.初始化一个类时,先初始化其父类。 接口则不是,只有真正引用到了父接口时,才会初始化。 4.对类进行反射调用时。 测试代码: MainClass: [java]viewplaincopy packagecom.xuefeng.jvm.load; /** *初始化类的时机 *1.虚拟机启动时指定的主类 *2.new某类的对象时、引用某类的static变量时、设置某
3、类的变量时、调用某类的static方法时 *3.初始化一个类时,先初始化其父类。接口则不是,真正使用到了父接口时,才会初始化父接口。 *4.通过反射调用某类时 *@authorxuefeng publicclassMainClass{ static{ System.out.println("MainClassinit."); } //1 publicstaticvoidmain(String[]args)throwsClassNotFoundException{ ////2 //System.out.println("SuperClass.
4、F_V1:"+SuperClass.F_V1); //System.out.println("SuperClass.v1:"+SuperClass.v1); ////3 //SubClasss1=newSubClass(); //3.1如果通过子类名引用父类的static变量,是否会触发子类的初始化? //这取决于具体的虚拟机实现,SunHotSpot虚拟机此时是不会触发子类的初始化的。 System.out.println(SubClass.v1); //4 Class.forName("com.xuefeng.jvm.load.SubClas
5、s"); } } SuperClass: [java]viewplaincopy packagecom.xuefeng.jvm.load; publicclassSuperClass{ static{ System.out.println("SuperClassinit."); } /** *引用v1时,会初始化SuperClass */ publicstaticintv1=1; /** *引用F_V1时,不会初始化SuperClass *staticfinal的变量,已经在编译器放到了常量池里 */ publicstatic
6、finalintF_V1=1; } SubClass: [html]viewplaincopy packagecom.xuefeng.jvm.load; /** *@authorxuefeng * */ publicclassSubClassextendsSuperClass{ static{ System.out.println("SubClassinit."); } } 疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,让你在半年的时间内
7、掌握8-10万的代码量,掌握Java核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!
此文档下载收益归作者所有