標籤:integer 輸出 pac class out 運行時 運行 bool 注釋
今天在看書的時候遇到了一個不是很懂的名詞,是在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關鍵字修飾。
java 編譯期常量