秋日的晚霞 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 我不明白为什么c#微软的官方api浏览器为什么不支持函数说明的检索,有支持检索函数说明的工具吗?
    • ¥15 ORBSLAM2框架跑ICL-NUIM数据集
    • ¥15 在我想检测ros是否成功安装时输入roscore出现以下
    • ¥30 老板让我做一个公司的投屏,实时显示日期,时间,安全生产的持续天数,完全没头绪啊
    • ¥15 Google Chrome 所有页面崩溃,三种解决方案都没有解决,我崩溃了
    • ¥20 使用uni-app发起网络请求,获取重定向302返回的cookie
    • ¥20 手机外部浏览器拉起微信小程序支付 (相关搜索:微信小程序)
    • ¥20 怎样通过一个网址找到其他同样模版的网址
    • ¥30 XIAO esp32c3 读取FDC2214的数据
    • ¥15 在工控机(Ubuntu系统)上外接USB蓝牙硬件进行蓝牙通信