A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋旭东 中级黑马   /  2013-7-5 22:37  /  1602 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static final int MAX=52; //这个是全局静态常量

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

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
这就是一个常量啊,静态常量是在第一次访问时初始化,在以后的访问中,不在初始化。
回复 使用道具 举报
hanrongle 发表于 2013-7-5 22:41
这就是一个常量啊,静态常量是在第一次访问时初始化,在以后的访问中,不在初始化。 ...

静态常量是随类加载的,好像...不存在对象初始化吧?下面那个应该是实例化对象时初始化的。
回复 使用道具 举报
第二个也是一个常量,但是其是在对象建立的时候初始化的。
回复 使用道具 举报
http://zhidao.baidu.com/question/261280295.html   在这里面  常量定义的基本注意事项中,有加static和不加static的区别,可以看一下哦{:soso_e142:}
回复 使用道具 举报
跟你说这人估计是《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,可是依然不是编译时常量。编译时知道我打算几点加载?

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 很给力!

查看全部评分

回复 使用道具 举报 1 0
static是个静态修饰符。有static修饰变量的时候,可以随着类的加载而直接出现在堆内存中。也就是常量了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马