黑马程序员技术交流社区

标题: 一个常量问题 [打印本页]

作者: 宋旭东    时间: 2013-7-5 22:37
标题: 一个常量问题
public static final int MAX=52; //这个是全局静态常量

public final int MAX=52;   //有人和我说这样定义不能算是一个常量!常量应该是编译的时候就确定
                                      //了!不能够改,而不加static就要在运行的时候才确定!这样不能算是一个常量。  这样是什么个情况呢?
求解!{:soso_e183:}

作者: hanrongle    时间: 2013-7-5 22:41
这就是一个常量啊,静态常量是在第一次访问时初始化,在以后的访问中,不在初始化。
作者: 宋旭东    时间: 2013-7-5 22:44
hanrongle 发表于 2013-7-5 22:41
这就是一个常量啊,静态常量是在第一次访问时初始化,在以后的访问中,不在初始化。 ...

静态常量是随类加载的,好像...不存在对象初始化吧?下面那个应该是实例化对象时初始化的。
作者: 黑马2014    时间: 2013-7-5 23:35
第二个也是一个常量,但是其是在对象建立的时候初始化的。
作者: 黑马2014    时间: 2013-7-5 23:39
http://zhidao.baidu.com/question/261280295.html   在这里面  常量定义的基本注意事项中,有加static和不加static的区别,可以看一下哦{:soso_e142:}
作者: longlangcx    时间: 2013-7-6 02:29
跟你说这人估计是《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,可是依然不是编译时常量。编译时知道我打算几点加载?
作者: 孙四有    时间: 2013-7-7 00:22
static是个静态修饰符。有static修饰变量的时候,可以随着类的加载而直接出现在堆内存中。也就是常量了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2