请写出最后的运行结果:
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)初始化为默认值——》
解析-将常量符号引用替换为具体值,类、接口、方法——》初始化 根据用户的定义初始化实际值(静态块、构造)
【 准备-变量分配内存、类变量(static)初始化为默认值:】
这里代码执行时:count1 =1 count2 =1
但是在【初始化 根据用户的定义初始化实际值(静态块、构造)】后
这里代码执行时 count1 =1 count2 =0
所以答案明显了
拓展 双亲委派模式:看下Jdk源码:只需看划线部分的核心代码 (jdk1.8)
判断是否已加载——》判断父类是否有加载器——》进行加载
简单的解释下