028-JVM-类加载子系统面试题实战

上一篇:027-JVM-打破双亲委派机制https://yuhongliang.blog.csdn.net/article/details/111755901
从实践到理论总结的过程 。

1. 分析代码的执行过程

package com.yuhl.c2020;

/**
 * @author yuhl
 * @Date 2020/12/27 13:55
 * @Classname Test2
 * @Description TODO
 */
public class Test2 {
    public static void main(String[] args) {
        System.out.println("最终的打印结果为:" + T.count);
        //System.out.println(T.finalCount);
    }
}
class T {
    public static int count = 2; //0
    public static T t = new T(); // null
    public final static int finalCount = 20; //0

    //private int m = 8;

    private T() {
        System.out.println("T类的无参数的构造方法被调用了!");
        System.out.println("count = " + count);
        count ++;
        System.out.println("我现在临时值:" + count);
        //System.out.println("--" + count);
    }
}



先给出答案:

T类的无参数的构造方法被调用了!
count = 2
我现在临时值:3
最终的打印结果为:3

2. 分析代码的执行过程

2.1 System.out.println(“最终的打印结果为:” + T.count);

要打印T.count的值,需要下加载T仅内存,加载class文件进内存需要以下几步:
在这里插入图片描述

2.2 由AppClassLoader类加载器记载

2.3 verification阶段判断class文件是否合法合规

2.4 preparation为变脸服初值

此时:

public static int count = 0; //0
public static T t = null; // null

2.5 简介引用变直接引用:

是有有这步取决于此处的boolean值是否为真
在这里插入图片描述

2.6 initialization阶段

  1. public static int count = 2; //0 赋值
  2. public static T t = new T();调用狗在其对count ++; 所以count=3
    分析完成。

3. 另一个例子

package com.yuhl.c2020;

/**
 * @author yuhl
 * @Date 2020/12/27 13:55
 * @Classname Test2
 * @Description TODO
 */
public class Test2 {
    public static void main(String[] args) {
        System.out.println("最终的打印结果为:" + T.count);
        //System.out.println(T.finalCount);
    }
}
class T {
	public static T t = new T(); // null
    public static int count = 2; //0
    public final static int finalCount = 20; //0

    //private int m = 8;

    private T() {
        System.out.println("T类的无参数的构造方法被调用了!");
        System.out.println("count = " + count);
        count ++;
        System.out.println("我现在临时值:" + count);
        //System.out.println("--" + count);
    }
}



和上面例子的不同在于:
在这里插入图片描述

4. 也给出结果

T类的无参数的构造方法被调用了!
count = 0
我现在临时值:1
最终的打印结果为:2

5. 分析过程

5.1 System.out.println(“最终的打印结果为:” + T.count);

要打印T.count的值,需要下加载T仅内存,加载class文件进内存需要以下几步:
在这里插入图片描述

5.2 由AppClassLoader类加载器记载

5.3 verification阶段判断class文件是否合法合规

5.4 preparation为变脸服初值

此时:

public static T t = null; // null
public static int count = 0; //0

5.5 简介引用变直接引用:

是有有这步取决于此处的boolean值是否为真
在这里插入图片描述

5.6 initialization阶段

  1. public static T t = new T();调用狗在其对count ++; 所以count=1
    分析完成。
  2. 代码顺序执行 count = 2; 所以输出为2.

6. 总计

要明白整个类加载子系统中各个阶段都做了什么事情。
通过这个例子应该很明白了整个过程了吧

  1. verification: 验证未见是否符合jvm规范,合法性检查
  2. preparation:静态变量默认值,记住是默认值哦!
  3. resolution:讲类、方法、属性的符号引用解析为直接引用,蝉联吃汇总的各种符号引用解析为指针,偏移量等内存地址的直接引用
  4. initializing:嗲用类初始化代码static代码块、static代码赋值(不是初值,是程序员福德之)哦!

下一篇:029-JVM-volatile和指令重排https://yuhongliang.blog.csdn.net/article/details/111997753

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值