我知道Singleton模式有很多問題。但是,在這裏我想知道的關於輸出的內容也可能涵蓋Java中「靜態」的工作原理。在Singleton程序中使用和流動Static語句
public class Singleton {
private static Singleton currentSingleton = new Singleton();
public static Singleton getSingleton() {
return currentSingleton;
}
private Singleton() {
System.out.println("Singleton private constructor...");
}
public static void main(String[] args) {
System.out.println("Main method...");
}
}
這是從運行代碼的輸出...
辛格爾頓私有構造...
主要方法...
當我調試這個代碼,控制先行 System.out.println("Singleton private constructor...")
並打印。 (私有靜態變量currentSingleton仍是空在這一點上)
便去排隊
private static Singleton currentSingleton = new Singleton();
,然後初始化私有變量。然後最後,它轉到main()方法並打印。
我的問題是:
- 爲什麼它首先打印「辛格爾頓私有構造......」這是私人的構造函數。 我想控制應該首先轉到main()方法,因爲它是入口點。另外我不會在任何地方創建任何實例(變量初始化除外)。
- 後來它進入靜態變量實例線(currentSingleton = NULL在這一點上)
private static Singleton currentSingleton = new Singleton();
雖然currentSingleton這裏得到一個值,爲什麼構造函數不會再次叫什麼名字?
主要是我想知道這個程序的控制流。
澄清:'直到它已經被正確initialized' - >'it'在這裏是*類對象*,而不是*類實例*。 – amit
好吧,第一類應該正確初始化,所以它會調用行private static Singleton currentSingleton = new Singleton();然後它應該調用構造函數並打印語句。但是當我調試它時,控制首先進入私有構造函數,打印然後去初始化私有靜態變量。這就是爲什麼我感到困惑。 – Girish
@amit有問題的類有一個靜態字段,您可以爲其賦值。由於該字段是靜態的,因此必須使用該類進行初始化,也就是說,它必須接收一個值。在這種情況下,它的值恰好是同一類的一個實例。這是在類初始化期間觸發你的私有構造器的原因。 –