2010-03-21 30 views
4

在下面的代碼中,稍後聲明DEFAULT_CACHE_SIZE,但是它之前被用來爲String變量賦值,所以很好奇它怎麼可能?類的即使我們使用稍後定義的常量,代碼如何被編譯?

public class Test { 

public String getName() { 
return this.name; 
} 

public int getCacheSize() { 
return this.cacheSize; 
} 

public synchronized void setCacheSize(int size) { 
this.cacheSize = size; 

System.out.println("Cache size now " + this.cacheSize); 
} 

private final String name = "Reginald"; 
private int cacheSize = DEFAULT_CACHE_SIZE; 
private static final int DEFAULT_CACHE_SIZE = 200; 
} 

回答

8

Sun docs

靜態改性劑,在與最終改性劑組合,也可以用來定義常量。最終修飾符表示該字段的值不能更改。

如果基本類型或字符串被定義爲常量,並且該值在編譯時已知,則編譯器會用代碼替換代碼中的常量名稱。這就是所謂的編譯時間常數

在你的代碼DEFAULT_CACHE_SIZE是一個編譯時間常數。

4

靜態屬性的類加載後這顯然是東西類實例化一個對象之前,出現這種情況總是立即解決。不像在C++中,所有的東西都必須在使用前在源代碼中聲明,在Java中,構造函數,字段和方法的實際順序對類的各種屬性的評估順序和時間沒有影響。

+2

正確但不相關。靜態最終在編譯時解決 - 請參閱codaddict的答案。 – 2010-03-21 17:29:34

0

它在定義之前未被使用。該分配可能位於源代碼中較高的一行,但與此無關 - javac將讀取整個源文件,然後開始生成代碼。 (這就是它如何能夠確定諸如'未使用的私有變量'等等)換句話說,語句的順序很重要,以確定序列中的哪些語句首先被執行,但是類的鄰居元素沒有'命令'這種類型之中。

但是,關於靜態/非靜態元素的規則,這些規則保證該值在類加載之後和對象實例化之前可用。