先来看一个例子:
package core.java; class SingleTon{ private static SingleTon instance = new SingleTon(); public static int num1; public static int num2 = 0; private SingleTon(){ num1++; num2++; } public static SingleTon getInstance(){ return instance; } } public class ClassLoaderTest { public static void main(String[] args) { SingleTon single = SingleTon.getInstance(); System.out.println("num1: "+single.num1); System.out.println("num1: "+single.num2); } }
输出结果是多少呢?也许很多人会犯错吧
运行一下吧:
这里涉及到类的加载和初始化过程:
1、类在被主动调用时,触发类的加载,jvm查找并加载类的二进制数据到内存
2、jvm检查class文件的正确性,因为防止恶意手动生成的class文件
3、为类的静态变量分配内存,并初始化默认值。
这一步是关键,此处的初始化默认值并非赋值,比如此时 instance 的值是null,num1是0,num2是0。而此时num2的0 不是‘=’赋值的0
4、把类的符号引用转换为直接引用。即:把引用变成指针,这是java中的指针,java在应用开发过程中是没有指针的,但是jvm里是有的。
5、初始化
a) instance = new SingleTon () 调用构造方法,num1 和num2 的值被赋值为1
b) num1用户没有给默认值,维持1;
c) num2用户给了默认值0,将0赋给了num2;
(未完待续)
更新1:2018-01-01,举个例子
原文地址:https://www.cnblogs.com/tensorflow-zh/p/8169347.html
时间: 2024-10-03 22:38:54