今天看代码的时候,关于常量的引用,脑子中突然闪现出一个概念。java中的常量,是不是必须定义为static final的呢?final定义的字段,已经是不可改变的了,为什么还必须要加上一个static呢?
比如
private static final int one = 1;
如果定义为
private final int one = 1;
两者有不什么不同吗?答案是肯定的,他们都是一样的。那为什么还要加上一个static呢?
关于这个问题,就是看一下java的运行机制了。程序从编写到执行,需要经过两个阶段:
1、代码的装载
2、对象建立
我们来设想一下这样一种情况:
假如这个常量是从一个函数,或者其他变量过来的,那么,结果会是什么样的呢?
比如
private static int random = new Random().nestInt(10);
private final int one = random;
每次加载这个类的时候,需要对这个对象进行初始化。如果有多次初始化,那么每次是不是都要给one赋不同的值呢,这样的话,虽然one是常量,但是每次初始化以后,还是会变化的。那么怎么解决这个问题呢,相信很多人已经有了答案,轮到static上马了。
改成:
private static final int one = random;
这样,不过你初始化多少次,它的值不会再变化了。只能是唯一的值了。为什么会这样呢?
java 的编译器,在代码装载的时候,初始化常量的值。后面如果再创建对象的时候,只引用这个常量对象的地址,而不再进行第二次初始化。
所以,总结一下:
1、如果常量引用的是一个固定值,那么加不加static的效果是一样的,除非声明为public的公共常量,需要加上static,可以直接调用。
2、如果常量引用的是一个函数,或者其他对象的赋值,那么就必须加上static了,要不,你就为莫名其妙的错误而头大了