詳見:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt223
常量是程序運行時恆定不變的量,許多程序設計語言都有某種方法,向編譯器告知一塊數據時恆定不變的,例如C++中的const和Java中的final。
根據編譯器的不同行為,常量又分為編譯時常量和運行時常量,其實編譯時常量肯定就是運行時常量,只是編譯時常量在編譯的時候就被計算執行計算,並帶入到程序中一切可能用到它的計算式中。
以Java為例,static final int a = 1將是一個編譯時常量,編譯后的符號表中將找不到a,所有對a的引用都被替換成了1。
而static final int b = "test".length()將是一個運行時常量。測試代碼如下:
//***********************************************************
public class CompilConstant {
public static void main(String[] args) {
System.out.println(Test.a);
System.out.println(Test.c);
}
}
class Test {
static {
System.out.println("Class Test Was Loaded !");
}
public static final int a =10;
public static final int c = "test".length();
}
=================================
10
Class Test Was Loaded !
0
=================================
即,(1)a被作為編譯期全局常量,並不依賴於類,而b作為運行期的全局常量,其值還是依賴於類的。
(2)編譯時常量在編譯時就可以確定值,上例中的a可以確定值,但是c在編譯器是不可能確定值的。
(3)由於編譯時常量不依賴於類,所以對編譯時常量的訪問不會引發類的初始化。
用樣的原因,靜態塊的執行在運行時常量之前,在編譯時常量之后