class SingleTon { private static SingleTon singleTon = new SingleTon(); public static int count1; public static int count2 = 1; private SingleTon() { count1++; count2++; } public static SingleTon getInstance() { return singleTon; } } public class Test { public static void main(String[] args) { SingleTon singleTon = SingleTon.getInstance(); System.out.println("count1=" + singleTon.count1); System.out.println("count2=" + singleTon.count2); } }
執行結果:singTon.count1=1 singTon.count2=1
class SingleTon { public static int count1; public static int count2 = 1; private static SingleTon singleTon = new SingleTon(); private SingleTon() { count1++; count2++; } public static SingleTon getInstance() { return singleTon; } } public class Demo { public static void main(String[] args) { SingleTon singleTon = SingleTon.getInstance(); System.out.println("count1=" + singleTon.count1); System.out.println("count2=" + singleTon.count2); } }
執行結果:count1=1 count2=2
private static SingleTon singleTon = new SingleTon(); 這句代碼再static int ...之前只影響未被賦值的變量,在static int...之后,全部影響
原因:實例的初始化流程
1.類被加載的時候,普通方法加載到方法區,靜態方法和靜態字段加載到方法區中的靜態區
2.首先靜態字段會進行默認初始化。即 singTon=null count1=0 count2=0
3.然后靜態字段會進行顯示初始化。問題就出現這里(這里就是影響結果的地方)
4(第一個例子先執行4).首先 singTon 進行顯示初始化 它會創建 實例,調用構造函數,執行完成以后
5(第二個例子先執行5).然后才是靜態變量 count1和count2進行顯示初始化
6.然后執行靜態代碼塊中的內容,此處沒有靜態代碼塊。