Java靜態變量初始化的坑


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.然后執行靜態代碼塊中的內容,此處沒有靜態代碼塊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM