最近整理的时候突然看到了常量那里,在以前的笔记上记着:
并非所有static final修饰的都是常量。
嗯。。很蒙,public static final +数据类型+常量名。这不就是定义常量用的吗???
在网上搜索,发现解释的都是一段代码+String 是一个比较特殊的类(str01: static final 修饰的变量不可变 , “abc”这个字符串也不可变)。更蒙了,这个和String有什么关系,String是fianl修饰的char,每次new新的地址都会变,但和是不是常量关系不大吧。
直到看到JVM解释里将常量分为了编译期常量和运行时常量。
编译期常量
static final int a = 123;
运行时常量
static final int b = a.length();
简单解释一下区别:
编译期常量:编译时,所有a的引用都将被替换成字面量(即123),类型必须是基本类型或String。所以后面的调用时,都是字面量,都是浮于表面的值。
运行时常量:在编译期不能确定他的值,可能为对应的null、0或是false等。只有在运行时才能确定他的值。(这里突出主题,问题出在这,值改变了,从不确定的值到确定的值)
所以,仅理论上而言,地址对应的内容是改变的,而常量是不变的。
仅从这点上,可以称static final修饰的并非都是(编译期)常量。