我對關鍵詞的理解可能與你們的不同,所以如果有些名詞的命名和你們的不一樣請幫忙指出一下,非常感謝。
下面中有兩個相同的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