加入收藏 | 设为首页 | 会员中心 | 我要投稿 宣城站长网 (https://www.0563zz.cn/)- 数据湖、行业智能、边缘计算、开发、备份!
当前位置: 首页 > 站长资讯 > 评论 > 正文

你还不懂JVM 中的类加载机制?

发布时间:2021-02-24 12:35:43 所属栏目:评论 来源:互联网
导读:其中加载、验证、准备、初始化和卸载五个步骤的顺序都是确定的,解析阶段在某些情况下有可能发生在初始化之后,这是为了支持 Java 语言的运行期绑定的特性。 何时开始类的初始化 创建类的实例 访问类的静态变量(除常量【被final修辞的静态变量】原因:常量一

其中加载、验证、准备、初始化和卸载五个步骤的顺序都是确定的,解析阶段在某些情况下有可能发生在初始化之后,这是为了支持 Java 语言的运行期绑定的特性。

何时开始类的初始化

  1. 创建类的实例
  2. 访问类的静态变量(除常量【被final修辞的静态变量】原因:常量一种特殊的变量,因为编译器把他们当作值(value)而不是域(field)来对待。如果你的代码中用到了常变量(`constant variable`),编译器并不会生成字节码来从对象中载入域的值,而是直接把这个值插入到字节码中。这是一种很有用的优化,但是如果你需要改变final域的值那么每一块用到那个域的代码都需要重新编译。
  3. 访问类的静态方法
  4. 反射如(`Class.forName("my.xyz.Test")`)
  5. 当初始化一个类时,发现其父类还未初始化,则先出发父类的初始化
  6. 虚拟机启动时,定义了main()方法的那个类先初始化
  • 主动引用:上面这些种行为称为对一个类的的主动引用,会触发类的初始化
  • 被动引用:除上面五种主动引用之外,其他引用类的方式都不会触发类的初始化,称为类的被动引用

接口的加载过程与类的加载过程稍有不同。接口中不能使用`static{}`块。当一个接口在初始化时,并不要求其父接口全部都完成了初始化,只有真正在使用到父接口时(例如引用接口中定义的常量)才会初始化。

被动引用例子

示例一

对于静态字段,只有直接定义这个字段的类会被初始化,如果是通过子类引用父类的字段,父类会被初始化,子类不一定会被初始化,子类会不会被初始化 JVM 虚拟机规范并没有明确规定,取决于虚拟机的具体实现


 

(编辑:宣城站长网)

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

    推荐文章
      热点阅读