首先来看一段代码
思考一个问题
输出结果为什么是counter1=1、counter2=0;
原因
JVM结束的几种方式
- System.exit()
- 程序执行完毕
- 遇到异常或错误而导致程序崩溃
- 操作系统错误
类的加载、连接与初始化过程
- 方法区存储Class二进制文件,并映射出数据结构。
- 堆区生成Class对象。
- 加载:加载二进制数据
- 连接
- 验证: 各种校验,验证它是一个class文件
- 准备阶段:为类的静态变量分配内存,并初始化为默认值。
- 解析:把类中的符号引用转化为直接引用,类似于将变量替换为指针。
- 初始化:为类的静态变量赋予用户赋予的值。
解释:
- 连接阶段
- 首先Sigleton类在连接阶段,将counter2初始化为int的默认值0。
- 将唯一实例sigleton初始化为null。
- 初始化阶段(由于执行了Sigleton.getInstance() 这个静态方法,触发类初始化)
- 执行 new sigleton(),执行counter2++,此时counter2加完之后值为1。
- 紧接着执行
counter2=0
这个初始化动作,将counter2的值从1改成0。
- 所以结果就是 counter2=0;