java 编译期常量

  今天在看书的时候遇到了一个不是很懂的名词,是在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关键字修饰。