2013-07-27 47 views
0

假設下面的類其中有一個私有構造一類的靜態變量的初始化

class A{ 
    public final static int num = 7; 
    public final static A instance = new A(); 
    private A(){} 
} 

class TestA{ 
    public static void main(String args[]){ 
    System.out.print(A.num); 
    } 
} 

在這種情況下當numinstance初始化時是在JVM加載類A?我瞭解JVM在初始化時會加載一個類,如果我錯了,請糾正我。由於類A具有私有構造函數,因此它不能在外部初始化。

在此先感謝。

+0

你是什麼意思?「實例被A.instance多次調用。」? –

+0

對不起,只是編輯我的帖子。如果num或實例被多個類調用(不同時)。 – Madz

+0

http://stackoverflow.com/a/17707504/2031799 - 可能是這可以幫助 – Mikhail

回答

1

當類首次被類加載器加載時,這通常是在您首次靜態地或通過實例化某些對象來使用類時初始化變量。導入不會被視爲使用類。編譯器會忽略它們,直到你真的對類做了什麼。

您可以使用類中的靜態初始化塊自定義初始化。這非常類似於構造函數,除非它在加載類時以及第一個構造函數調用之前執行。

class Foo { 
    public static final String FOO; 

    { 
    FOO="helloworld"; 
    } 
} 
+0

所以順序是; 1-作爲TestA的變量'instance'調用A.num 2- A類到'new A()' 2-變量'num', 對不對? – Madz

+0

當你訪問A.num時,是的類加載器加載類,它初始化A並最終調用A()。 –

1

它在加載類時執行。無論何時構造類或訪問它的靜態變量/方法,都會加載一個類。

+2

進口與此無關。它們甚至在運行時不存在。只在源代碼中。 –

+0

@JBNizet感謝您的意見。我修改了答案。 –

+0

這仍然是錯誤的。當另一個引用它的類被加載時,一個類不會被加載。當需要時,它會被懶惰地裝載。即如果類A中的方法需要類B但是從不調用,則類B將永遠不會被加載。 –

1

你是對的,當類加載時,靜態塊和靜態變量被初始化,因爲它們屬於這個類。

1

對象A.instance是在代碼中使用的第一參考時發現如要加載

1

另一個類的依賴關係初始化,類A初始化實際上當您使用A.num它不會在初始化所有,因爲編譯會替換常量,並且在使用A.num時,編譯器會將其替換爲7

您可以反編譯編譯的類來查看。

但是A.instance在類加載器加載A時被初始化。

+0

如果您在加載「A」時說「實例」已初始化,何時會加載「A」? – Madz

1

由於num和instance是類的靜態數據。靜態意味着在類的所有實例之間共享某些東西。當你的類在JVM中加載時,所有的靜態數據都會被加載。您不需要等待實例創建來訪問靜態數據。因此,只要運行類num,實例就會在運行時加載到JVM中。

問候

1

一個標準的Java類,不只是這是java.lang.Math

既然是一個實用工具類,不打算被實例化的一個例子,構造函數是私有的,但它包含常數對於E ,PI等...

相關問題