秋日的晚霞 2021-10-27 22:57 采纳率: 94.4%
浏览 23
已结题

静态代码块和类的加载问题求解

静态代码块随着类的加载而加载

创建一个对象或者访问一个类的静态成员时,一定会加载该类

同一个类中多次创建该类或者访问该类的静态成员为什么只会加载一次?

而不同的类没次访问都会加载一次?

内存中不是以已经有了该类的字节码对象,为什么还会去加载

JVM只有一个,类的符号引用已经有了 不同的类new为什么又会去加载

JDK7后常量池在堆中,而堆又是线程共享的 JVM只有一个,那么堆也只有一个,常量池也是一个,共享,难道其他的类不知道常量池中已经有了该类的符号引用吗?

  • 写回答

1条回答 默认 最新

  • 穆瑾轩 2021-10-28 00:42
    关注

    JVM将类加载过程分为:加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载。

    加载过程中会先检查类是否被已加载,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。在虚拟机的生命周期中一个类只被加载一次。
    类加载的时机:
    1)第一次创建对象要加载类.
    2)调用静态方法时要加载类,访问静态属性时会加载类。
    3)加载子类时必定会先加载父类。
    4)创建对象引用不加载类.
    5) 子类调用父类的静态方法时
    6)访问静态常量,如果编译器可以计算出常量的值,则不会加载类
    new 如果没有当然回去加载,如果有了,那就不会去加载。而是去初始化了。静态初始化是属于类加载的过程,所以它只执行一次,而实例初始化是每个对象创建时都会执行一次。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月5日
  • 已采纳回答 10月28日
  • 修改了问题 10月27日
  • 创建了问题 10月27日

悬赏问题

  • ¥15 ATAC测序到底用什么peak文件做Diffbind差异分析
  • ¥15 安装ubantu过程中第一个vfat 文件挂载失败
  • ¥20 GZ::CTF如何兼容一些靶机?
  • ¥15 etcd集群部署问题
  • ¥20 谁可以帮我一下问一下各位
  • ¥15 为何重叠加权后love图的SMD与svyCreateTableOne函数绘制基线表的不一致
  • ¥15 QFILHelper怎么恢复全字库,提示进程已完成,只能恢复分区文件
  • ¥150 求 《小魔指》街机游戏机整合模拟软件
  • ¥20 你好,我想问下easyExcel下拉多选,或者复选框可以实现吗
  • ¥20 双非跨考工科哪个专业和方向就业前景好?