类什么时候执行初始化

这篇具有很好参考价值的文章主要介绍了类什么时候执行初始化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

类什么情况加载《Java虚拟机规范》未强制约束,由虚拟机实现自由把握。 但是严格规定了 有且只有 六种情况必须立即对类进行 初始化

1、遇到newgetstaticputstaticinvokestatic这四条字节码指令时

典型Java代码场景有:

  • 使用 new 关键字实例化对象的时候;
  • getset 一个类型的 静态字段 的时候(被final修饰、已在编译期把结果放入常量池的静态字段除外);
  • 调用一个类型的静态方法的时候;

2、使用java.lang.reflect包的方法对类型进行 反射调用 的时候,如果类型没有进行过初始化,则需要先触发其初始化。


3、当初始化类的时候,如果发现其 父类还没有进行过初始化 ,则需要先触发其父类的初始化

4、当一个接口中定义了JDK 8新加入的默认方法(被default关键字修饰的接口方法)时,如果有这个接口的 实现类发生了初始化,那该接口要在其之前被初始化。


5、当虚拟机启动时,用户需要指定一个要 执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。


6、当使用JDK 7新加入的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStaticREF_putStaticREF_invokeStaticREF_newInvokeSpecial四种类型的 方法句柄,并且这个方法句柄对应的类没有进行过初始化,则需要先触发其初始化。

这六种场景中的行为称为对一个类型进行主动引用


除此之外,所有引用类型的方式都不会触发初始化,称为被动引用

下面举三个例子来说明何为被动引用
1) 通过子类引用父类的静态字段,不会导致子类初始化
2) 常量在编译阶段会存入调用类的常量池中,本质上没有直接引用到定义常量的类,因此不会触发定义常量的类初始化。
3) 通过数组定义来引用类,不会触发此类的初始化:SuperClass[] sca = new SuperClass[10];

-----------------------------------------------------------------------------读书笔记摘自 书名:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)作者:周志明文章来源地址https://www.toymoban.com/news/detail-641046.html

到了这里,关于类什么时候执行初始化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue 先初始化父组件再初始化子组件的方法(自定义父子组件mounted执行顺序)

    写在前面: 本篇内容内容主要讲述了,在使用 Konva 进行开发过程中遇到的一些问题。(既然是组件加载顺序,主要牵扯到的就是,父子组件的关系,父子组件的生命周期) 众所周知, Vue 中父子组件生命周期的执行顺序为: 然而,在某些情况下我们有其他需求,例如我们不

    2024年02月12日
    浏览(49)
  • 常见问题03:SpringBoot项目启动初始化数据(执行sql文件)

    使用外部资源中定义的 SQL 脚本填充、初始化或清理数据库。 调用addScript(org.springframework.core.io.Resource)以添加单个 SQL 脚本位置。 调用addScripts(org.springframework.core.io.Resource…)以添加多个 SQL 脚本位置。 请参阅此类中的 setter 方法以获取更多配置选项。 调用populate(java.sql.Connect

    2024年02月13日
    浏览(55)
  • MySQL篇一,初始化安装,Pycharm可视化链接MySQL数据库,Pycharm执行MySQL命令,MySQL的基础命令和数据类型的认识,最后尝试创建一张表和写入一行数据

    ⭐ 简介:大家好,我是zy阿二,是一名对知识充满渴望的自由职业者。 ☘️ 最近我沉溺于Python的学习中。你所看到的是我的学习笔记。 ❤️ 如果对你有帮助,请关注我,让我们共同进步。有不足之处请留言指正! Mysql系列文章传送门,建议循序渐进的学习: 1. Mysql入门安装

    2024年01月23日
    浏览(57)
  • vue 初始化方法 create,beforeMount,mount,computed,watch 方法执行顺序及使用场景

    前言:vue 存在一些基本属性和相关对象如果合理使用,可以避免代码混乱 执行顺序 create beforeMount computed mounted watch 方法说明 created执行时挂载阶段还没有开始,模版还没有渲染成html,所以无法获取元素。created钩子函数主要用来初始化数据。 beforeMount 这一步的时候,模版已经

    2024年02月11日
    浏览(51)
  • Vue3 从初始化到首次渲染发生了什么?

    本文从createApp开始简要分析都做了些什么。位置在packages/runtime-dom/src/index.ts  思维导图:  Mind Mapping Software: Mind Maps | MindMeister 1.createApp 初始化时首先调用了 createApp  ,通过 createRenderer 创建了一个渲染器   baseCreateRenderer 方法非常长,包含了渲染器的所有方法,createApp是 crea

    2024年02月11日
    浏览(47)
  • Spring Boot进阶(52):Spring Boot 如何集成Flyway并初始化执行 SQL 脚本?| 超级详细,建议收藏

           在我们的认知中,我们会使用 SVN 或 Git 进行代码的版本管理。但是,我们是否好奇过,数据库也是需要进行版本管理的呢?         在每次发版的时候,我们可能都会对数据库的表结构进行新增和变更,又或者需要插入一些初始化的数据。而我们的环境不仅仅只

    2024年02月15日
    浏览(34)
  • 基于ansible初始化linux服务器基础环境。

    大家好,今天我要和大家分享一个关于搭建centos环境的新方法。 以前我们经常会看到一些文章介绍如何搭建centos环境,但很多时候都会出现一些问题。不过现在有了一种新的方法,就是使用ansible脚本来实现。 虽然这种方法仅适用于centos7,但只要稍作修改就可以应用到其他的

    2023年04月27日
    浏览(46)
  • 神经网络基础-神经网络补充概念-24-随机初始化

    在神经网络的训练过程中,权重和偏差的初始值对模型的性能和训练过程的收敛速度都有影响。随机初始化是一种常用的权重和偏差初始值设置方法,它有助于打破对称性,避免网络陷入局部最优解。 当所有权重和偏差都被设置为相同的初始值时,神经网络的每个神经元在反

    2024年02月12日
    浏览(50)
  • 【Git】解决‘每次初始化一个新仓库时,都需要执行git config --global --add safe.directory命令‘

    这个命令是用来将一个安全目录添加到全局的 Git 配置中。但每次克隆一个仓库或者新建一个仓库,并且对该仓库进行操作时,都需要执行该命令,十分麻烦! 这是因为,Git 近期进行了版本升级,添加了新的目录安全限制。造成在进行git常规操作时无法发现.git文件。 方案一

    2024年04月08日
    浏览(54)
  • 多进程运行含有任意参数的函数、为什么multiprosessing会进行多次初始化

    目录 多进程运行含有任意个参数的函数,以map_async为例 为什么multiprocessing 的了进程会多次初始化?         使用偏函数:偏函数有点像数学中的偏导数,可以让我们只关注其中的某一个变量而不考虑其他变量的影响。 如以下代码中,我们要将set_seq、tokenizer和model作为变量

    2024年02月03日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包