我对关键词的理解可能与你们的不同,所以如果有些名词的命名和你们的不一样请帮忙指出一下,非常感谢。
下面中有两个相同的new Singleton() 位置不一样结果也就完全不同了,因为执行的顺序是不同的。
PS:下面的代码非本人所写,是在csdn上看到的,但找不到原作者了,除了代码其余的都是自己的理解。
class Singleton{
private static Singleton singleton = new Singleton(); // 1
public static int counter1;
public static int counter2 = 0;
private Singleton(){
counter1++;//1
counter2++;//1
}
// private static Singleton singleton = new Singleton(); // 2
public static Singleton getInstance(){
return singleton;
}
}
public class Test{
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println("counter1 = " + singleton.counter1);
System.out.println("counter2 = " + singleton.counter2);
}
}
假设第一个new Singleton() 存在,第二个new Singleton()被注释
步骤:
- 执行main()中的Singleton.getInstance()
- 找到Singleton类中的getInstance()里面的代码
- return singleton 有返回值,找到这个值,是一个静态变量(类变量)
- 找到这个值之后会发现是通过new Singleton()获得,再接着找Singleton()看里面的代码
- 后++并没有被使用所以counter1和counter2通过后++都变为了1
- new Singleton()执行完毕,结果为counter1=1 counter2=1 ,再按序执行代码
- public static int counter1;静态变量(类变量)默认值为0,但前面已经将counter1通过后++变成1 所以这里也为1
- public static int counter2 = 0; 前面原本通过后++变成了1但现在又进行了一次赋值,所以现在为0
- 现在Singleton.getInstance()里面的都执行完毕,再按序执行两个println();
- 结果为counter1=1 counter2=0
假设第二个new Singleton() 存在,第一个new Singleton()被注释
步骤:
- 执行main()中的Singleton.getInstance()
- 找到Singleton类中的getInstance()里面的代码
- return singleton 有返回值,找到这个值,是一个静态变量(类变量)
- 找到这个值之后会发现是通过new Singleton()获得,这个时候是重点了,我的理解是静态肯定是最先加载的,上面的new Singleton()也有static 所以是静态并且是在所有静态之前,是第一个,所以正常按序加载,不过需要将new Singleton()里面执行完毕后才执行下面的,而这里new Singleton()虽然也是静态但不是第一个所以先加载上面的静态。
- 执行最上面的两个静态变量 counter1虽然没有声明但默认为0,counter2=0 (静态变量int类型默认值为0 String默认值为null boolean默认值为false)
- 现在在使用new Singleton()里面的代码 counter1++ 从默认值0变成1 counter2++ 从声明的0变成1
- 现在Singleton.getInstance()里面的都执行完毕,再按序执行两个println();
- 结果为counter1=1 counter2=1