查看完整视频
评论可见

您需要在视频最下面评论,方可查看完整视频

积分观看

您支付积分,方可查看完整视频

{{user.role.value}}
付费视频

您支付费用,方可查看完整视频

¥{{user.role.value}}
专属视频

只允许以下等级用户查看该视频

升级
会员专享

深入JVM类加载全过程解析

JVM类加载过程:生命周期

一个类从被加载到内存开始到它卸载,生命周期可以分为7个阶段:

  1. 加载(loading)
  2. 验证(verification)
  3. 准备(preparation)
  4. 解析(resolution)
  5. 初始化(initialization)
  6. 使用(using)
  7. 卸载(unloading)

其中,加载、验证、准备、解析和初始化是类加载的过程。

隐藏内容,您需要满足以下条件方可查看
End

课后作业

class SingleTon {

    private static SingleTon singleTon = new SingleTon();
    public static int count1;

    public static int count2 = 0;

    private SingleTon() {
        count1++;
        count2++;
    }

    public static SingleTon getInstance() {
        return singleTon;
    }

    public static void main(String[] args) {
        SingleTon singleTon = SingleTon.getInstance();
        System.out.println("count1=" + singleTon.count1);
        System.out.println("count2=" + singleTon.count2);
    }
}

最后count1与count2的计算结果是什么?

重点谈谈为什么数据的结果是这样的?

JVM

深入JVM内存模型(图文视频详解)

2020-8-13 17:30:42

JVM

JVM Class字节码深度剖析,手把手教你剖析!

2020-8-24 18:32:18

4 条回复 A文章作者 M管理员
  1. count1=1,count2=0

    静态变量顺序初始化
    1. singleTon 初始化,调用构造函数 两个值都设置为1.
    2.count2 重新初始化为0

    • good ✗拳头✗

  2. count1=1,count2=0
    主要涉及或者说考察的是类的加载过程,尤其是类加载过程之中,准备阶段和初始化阶段的区别。
    在准备阶段,会给类的静态变量一个默认的初始值,在准备阶段完成之后,count1和count2的值都是0
    初始化阶段(只有类或接口被java程序首次主动使用时才初始化他们),类的静态变量会被赋予正确的初始化值。
    在当下的例子中,SingleTon是在main方法中调用的时候开始初始化的
    singleTon对象初始化完成之后,count1和count2的值变成了1
    System.out.println(“count2=” + singleTon.count2);
    这句语句count2会被赋予正确的初始化值0

    • 这道题的核心关键考点主要是考:类在初始化的时候是先给构造方法中的属性赋值,还是类在初始化(类加载过程的最后一步)的时候赋值,最后的大致步骤主要范围以下5个步骤:

      1:SingleTon singleTon = SingleTon.getInstance();调用了类的SingleTon调用了类的静态方法,触发类的初始化
      2:类加载的时候在准备过程中为类的静态变量分配内存并初始化默认值 singleton=null count1=0,count2=0
      3:类初始化化,为类的静态变量赋值和执行静态代码快。singleton赋值为new SingleTon()调用类的构造方法
      4:调用类的构造方法后count=1;count2=1
      5:继续为count1与count2赋值,此时count1没有赋值操作,所有count1为1,但是count2执行赋值操作就变为0

个人中心
今日签到
搜索