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