final变量编译时期就确定具体值,是什么意思呢?
当final修饰变量是基本数据类型以及Stirng类型是,如果在编译器就能知道他的确切的值,则编译器会把它当做编译期常量使用,也就是说在用到该final变量的地方,相当于直接访问的这个常量。
在项目中,可能会遇到这种情况,在调用一个pubUtil中的某一个方法时,由于其中引用了我们修改的一个propertyName接口/类定义文件,这里面的变量是final的,但是我们并没有对pubUtil做任何修改,这时,我们发现调用pubUtil中的方法时,引用propertyName中的值还是以前的。这时,就需要将pubUtil重新编译。
案例如下:
//--定义一个公共类--//
package com.cn.test;
public class propertyName {
/**定义一个final变量*/
public static final String strName = "我是final";
public static String strNamenew = "我不是final";
static {
System.out.println("大家好,我进来了");
}
}
//--测试类--//
public class testFinalDemo{
public static void main(String[] args) {
String str = propertyName.strName;//调用final
System.out.println(str);
//----上面输出结果:我是final-----//
String str1 = propertyName.strNamenew;
System.out.println(str1);
//----上面输出结果:大家好,我进来了-----//
//------------------我不是final---------//
}
}
我们发现,调用final变量并没有导致propertyName类中的静态块执行。实际上,我们引用的propertyName.strName,在编译期就已经确定为“我是final”常量了。这也是为什么,我们改动项目中propertyName接口/类中的final属性时,要将其重新编译的原因。
下面使用反编译工具看下: