java中的常量,是不是必须定义为static final的呢

来源:互联网 发布:维斯布鲁克体测数据 编辑:程序博客网 时间:2024/05/01 11:29

今天看代码的时候,关于常量的引用,脑子中突然闪现出一个概念。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了,要不,你就为莫名其妙的错误而头大了

原创粉丝点击