java類加載順序筆試題之出現new時如何思考(個人理解)

我對關鍵詞的理解可能與你們的不同,所以如果有些名詞的命名和你們的不一樣請幫忙指出一下,非常感謝。

下面中有兩個相同的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()被註釋

步驟:

  1. 執行main()中的Singleton.getInstance()
  2. 找到Singleton類中的getInstance()裏面的代碼
  3. return singleton 有返回值,找到這個值,是一個靜態變量(類變量)
  4. 找到這個值之後會發現是通過new Singleton()獲得,再接着找Singleton()看裏面的代碼
  5. 後++並沒有被使用所以counter1和counter2通過後++都變爲了1
  6. new Singleton()執行完畢,結果爲counter1=1 counter2=1 ,再按序執行代碼
  7. public static int counter1;靜態變量(類變量)默認值爲0,但前面已經將counter1通過後++變成1 所以這裏也爲1
  8. public static int counter2 = 0; 前面原本通過後++變成了1但現在又進行了一次賦值,所以現在爲0
  9. 現在Singleton.getInstance()裏面的都執行完畢,再按序執行兩個println();
  10. 結果爲counter1=1 counter2=0

假設第二個new Singleton() 存在,第一個new Singleton()被註釋

步驟:

  1. 執行main()中的Singleton.getInstance()
  2. 找到Singleton類中的getInstance()裏面的代碼
  3. return singleton 有返回值,找到這個值,是一個靜態變量(類變量)
  4. 找到這個值之後會發現是通過new Singleton()獲得,這個時候是重點了,我的理解是靜態肯定是最先加載的,上面的new Singleton()也有static 所以是靜態並且是在所有靜態之前,是第一個,所以正常按序加載,不過需要將new Singleton()裏面執行完畢後才執行下面的,而這裏new Singleton()雖然也是靜態但不是第一個所以先加載上面的靜態。
  5. 執行最上面的兩個靜態變量 counter1雖然沒有聲明但默認爲0,counter2=0 (靜態變量int類型默認值爲0 String默認值爲null boolean默認值爲false)
  6. 現在在使用new Singleton()裏面的代碼 counter1++  從默認值0變成1  counter2++ 從聲明的0變成1
  7. 現在Singleton.getInstance()裏面的都執行完畢,再按序執行兩個println();
  8. 結果爲counter1=1 counter2=1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章