【代码底层设计】-【源码分析】-一道测试类加载的代码片段

请写出最后的运行结果: 

package com.oneself.classloader.flow;

/**
 * @Description: TODO
 * @Author Cheri
 * @Date 2019/8/13 - 16:37
 * @Version V1.0
 **/
public class Simple {

    private static Simple simple = new Simple();// null 0 0
    public static int count1;
    public static int count2 = 0;//这个是关键

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

   public static Simple getInstance(){
       return simple;
   }

    public static void main(String[] args) {

       //1初始化时 1 ,1
        //调用时 1,0
       Simple.getInstance();
        System.out.println("count1 ="+count1);
        System.out.println("count2 ="+count2);
    }
}

 

如果你不加思索直接回答 1、1, 那就错误了,正确的应为 1,0

为啥?这样主要还是对类加载顺序的掌握

类 装载流程:验证字节码-(JVM格式规范)元数据、符号、——》准备-变量分配内存、类变量(static)初始化为默认值——》

解析-将常量符号引用替换为具体值,类、接口、方法——》初始化 根据用户的定义初始化实际值(静态块、构造)

【代码底层设计】-【源码分析】-一道测试类加载的代码片段_第1张图片

【 准备-变量分配内存、类变量(static)初始化为默认值:】

这里代码执行时:count1 =1 count2 =1

 但是在【初始化 根据用户的定义初始化实际值(静态块、构造)】后

这里代码执行时 count1 =1 count2 =0

所以答案明显了

拓展 双亲委派模式:看下Jdk源码:只需看划线部分的核心代码 (jdk1.8)

判断是否已加载——》判断父类是否有加载器——》进行加载

 

【代码底层设计】-【源码分析】-一道测试类加载的代码片段_第2张图片

简单的解释下 

【代码底层设计】-【源码分析】-一道测试类加载的代码片段_第3张图片

你可能感兴趣的:(Java基本原理,JDK)