java 運行時常量、編譯時常量、靜態塊執行順序


詳見: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)由於編譯時常量不依賴於類,所以對編譯時常量的訪問不會引發類的初始化。

 

用樣的原因,靜態塊的執行在運行時常量之前,在編譯時常量之后

 


免責聲明!

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



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