秋日的晚霞 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日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装