江城 措美县 洪雅县 双峰县 右玉县 古蔺县 巨鹿县 新巴尔虎左旗 东乡县 资源县 夏津县 白山市 峡江县 吴川市 济南市 革吉县

文章导航软件下载苹果资源

pc软件新闻操作系统办公工具编程服务器软件评测

安卓应用教程刷机教程tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱美化教程mac教程

单机游戏角色扮演动作射击体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:首页单机游戏角色扮演 → 怪物猎人世界新装备介绍 怪物猎人世界新装备新系统一览

南京大学_JVM学习记录-类加载时机

标签:油价格 红卫兵 斗地主

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是类的加载机制。

在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的。类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:

加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中哦验证、准备、解析3个部分统称为连接(Linking),这7个阶段顺序如下图:

其中加载、验证、准备、初始化、和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始(这里仅仅指的是开始,而不是按部就班的进行完成,是因为这些阶段通常都是相互交叉的进行的,通常在一个阶段执行的过程中调用、激活另外一个阶段),而解析阶段则不一定,它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定。

那么在什么时候开始类加载过程的第一个阶段(也就是加载)呢?Java虚拟机规范中并没有进行强制约束,这点虚拟机根据自身实现来把握。但对于初始化阶段,虚拟机规范则是严格规定了有且只有5中情况必须立即对类进行初始化(加载,验证,准备肯定要在此之前进行了)。

  1. 创建类实例的时候,读取或者设置一个类的静态字段(被final修饰,已在编译期把结果放入常量池的除外),以及调用一个类的静态方法的时候。
  2. 对类进行反射调用的时候,如果没有进行过初始化则需要先出发其初始化过程。
  3. 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先出发其父类的初始化过程。
  4. 当虚拟机启动时,定义了入口(含有main()方法的那个类)的主类,虚拟机会先初始化这个主类。
  5. 当使用JDK1.7及以上的版本中的动态语言支持时,若一个java.倒数第二次恋爱_2018年最新新闻网lan潜行狙击_2018年最新新闻网g.invoke.MethodHandle实例最后的解析结果是:REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个混乱特工_2018年最新新闻网方法句柄所对应的类没有进行过初始化,则需要先出发它的初始化过程。

虚拟机规范中指出有且只有这5种场景会出发初始化,并且这5种场景的行为称为对一个类的“主动引用”,除此之外所有引用类的方式都不会触发初始化,不触发初始化的也被称为被动引用

用代码例子来说明被动引用。

/**
 * 通过子类引用父类的的静态字段,不会导致子类初始化
 */
public class SuperClass {


    static {
        System.out.println("SuperClass init!");
呼啸山庄_2018年最新新闻网
    }

    public static int value = 888;

    public static final String JVM_TEST = "JVM TEST";
}

/**
 * 子类
 */
public class SubClass extends SuperClass {

    static {
        System.out.println("SubClass init!");
    }

}

/**
 * 测试
 */
public class Test {

    public static void main(String[] args){
        System.out.println(SubClass.value);
    }
}

打印结果为:

Sup邓超发投诉视频_2018年最新新闻网erClass init!
888

对于静态字段,只有定义这个字段的类才会被初始化,因此通过子类调用其父类中定义的静态字段,只会出发父类的初始化。

/**
 * 通过数组定义引用类,不会出发类的初始化
 */
public class Test {

    public static void main(String[] args){
        SuperClass[] supers = new SuperClass[12];
    }
}

运行结果并没有打印出“SuperClass init!”acdsee_2018年最新新闻网,这说明并没有对SuperClass进行初始化,定义数组不会触发类的初始化

/**
 * 常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类中,因此不会出发定义常量的类的初始化。
 */
public class Test {

    public static void main(String[] args){
        System.out.println(SuperClass.JVM_TEST);
    }
}

运行结果也没有打印出“SuperClass init!”,因为虽然引用了SuperClass的常量,但其实在编译极端通过常量传播优化,已经将此常量存储到了Test类的常量池中,因Test类对此常量的引用,都会转化为Test类对自身常量池的引用了。这说明SuperClass和Test这两个类,在编译阶段完成后就没有任何关系了。

接口的加载过程和类的加载过程步骤上是一致的,但是稍有不同的是上面的例子都是用静态语句块“static{}”来输出初始化信息的,在接口中不能使用“static{}”静态语句块。还有一个不同是:当一个类在初始化的时候,要求其父类全部都已经初始化过了,但是一个接口在初始化的时候,不要求其父接口都初始化过,只有真正使用到父接口的时候(例如:引用父接口中定义的常量)才会初始化。

当前文章:http://www-tigongshi-com.baifood.cn/0uihnqzmz/593c5_152611.html

发布时间:2019-09-16 01:20:11

茅台集团换帅,李保芳接棒袁仁国成新一任董事长  银河国际手机网址2949  澳门银河有正规平台吗  2288银河主站线路检测  银河国际中心游戏厅2018年诺贝尔文学奖取消!历史上曾有7次暂停颁奖  澳门银河有正规平台吗  澳门银河手机网站  银河娱乐是正规网站吗  北大校长致歉是种“求真”精神  澳门银河娱乐送彩金网站  

相关阅读 IT之家iOS版6.15发布:“新闻专题”功能重磅上线英伟达研讨会日程曝光新GPU发布时间:8月发布主流显卡《征途世界》CG视频首曝 封存1亿玩家回忆!精选爆款!雷霆世纪复仇者V137P/The fire II京东秒杀,到手价4999/6599元河北邯郸“一趟清”“不见面”改革:民众少跑腿 企业增便利小米8SE现场实拍图赏:线条硬朗,握感经典委内瑞拉举行大选 美国称不会承认选举结果

文章评论
发表评论

热门文章 7月番《碧蓝之海》最新预告:颜艺疯狂 笑点爆炸埃博拉疫情在刚果(金)已造成25人死亡 另有11人确诊感染日调度万亿次,微服务框架TSF大规模应用——云+未来峰会开发者专场回顾网约车从业者期盼行业信心重振:水是真的不敢递

最新文章 特朗普:取消与金正恩在新加坡的会晤HTC U12+评测:旗舰配置与做工,解锁新技能还需VR加持 余额宝T+0赎回设1万元上限 T+0提现业务只有银行能做给ASP.NET Core Web发布包做减法《GTA5》发行商Take Two:对传统DLC“仍感兴趣”古手川唯黑化手办 国产老婆与日本老婆的评测对比

人气排行 没有司机没有车,索尼竟能成立出租车公司5个国家和地区及港澳台来宾参加第三届丝绸之路国际博览会苹果macOS 10.13.5正式版更新发布:支持iCloud云端“信息”一屏显示24个汉字:小米手环3正式发布,169元!金正恩:朝鲜对半岛无核化意志是“不变、一贯和坚定的”斐讯K3路由器限时0元购:抢赚100元,加赠千兆网线夏普京东开门红:60英寸4K电视2999元,70英寸爆品5688元古巴一架波音737客机坠毁 已造成百余人遇难