跟你说这人估计是《java编程思想》看晕了{:soso_e127:}里面说了一段关于编译时常量、运行时常量、static、final的内容,估计那人没理解透。
首先看到final数据就确定它是一个常量了,即使不是编译时常量,那也叫常量。
然后再说说他所说的编译时常量的问题。
public static final int MAX=52; //毫无疑问,这是一个编译时常量。
public final int MAX=52; //不用怀疑,这个也是一个编译时常量。
是不是编译时常量不看static,主要看三点:
一、是不是final的,final代表不可改变,一个可变化的值肯定是不能在编译期确定的。
二、看类型,基本数据类型可能在编译期确定,引用类型则通常不能。
三、看赋值的内容,52是个直接常量,是可以在编译时确定值的。
这三条都具备,那么public final int MAX=52; 这个就是定义了一个编译时常量。也就是说,没有static也可能是编译时常量。
而即使带着static final,也未必就是编译时常量。随便举俩反例:
public static final Object OBJ = new Object(); //static final,那么是编译时常量么?显然不是,编译时怎么知道这个Object会在什么位置开辟空间?让obj引用指向哪里好呢?
public static final long A_TIME = System.currentTimeMillis(); //不但是static final,还是基本数据类型long,可是依然不是编译时常量。编译时知道我打算几点加载? |