今天在看書的時候遇到了一個不是很懂的名詞,是在think in java 這本書的第七章講final關鍵字時講到的。然后自己在網上查了一下知道了一些。
編譯器常量就是:它的值在編譯期就可以確定的常量。也就是說在編譯的時候就已經為用到這些常量的地方賦好值了。下邊這段程序可以很好地幫助我們找出哪些是編譯期常量哪些不是。
package com.wenge.compileTest; public class CompileTest{ public static void main(String args[]){ // System.out.println(Data.i1); // System.out.println(Data.i2);//initialization! // System.out.println(Data.b1);//initialization! // System.out.println(Data.b2); // System.out.println(Data.s1); // System.out.println(Data.s2);//initialization! // System.out.println(Data.a); //initialization! // System.out.println(Data.e); //initialization! } } class Data{ static{ System.out.println("initialization!"); } public static final int i1 = 0; public static final Integer i2 = 0; public static final Boolean b1 = true; public static final boolean b2 = true; public static final String s1 = "0"; public static final String s2 = new String("0"); public static final A a = new A(); public static final Enum e = E.A; } class A{ } enum E { A,B,C,D,E,F,G; }
我們在main方法中一次只輸出一個數據,其余的注釋掉,然后我們可以通過看控制台有沒有輸出"initialization!"而判斷輸出的常量的類型是不是編譯期常量。因為"initialization!"是寫在靜態代碼塊里的,所以如果只要CompileTest類的main方法用到Data類里的屬性Data類里的靜態代碼塊就會被執行從而輸出"initialization!"。
然后單獨運行時是否輸出"initialization!"已經在后邊注釋了。(有注釋的就說明輸出了)所以很容易可以從輸出結果中得到結論:java中的編譯期常量包括java八大基本類型和直接聲明的string類型。什么是直接聲明的string類型呢?就是沒有通過new關鍵字聲明的字符串(String str = "abc";)。
當然了常量的前提是有final關鍵字修飾。