6.4.4 可执行 宏替换的 final变量
什么样的final变量可以当成直接量
对一个final
变量来说,不管它是类变量、实例变量,还是局部变量,只要该变量满足两个条件这个final
变量就不再是一个变量,而是相当于一个直接量。
- 在定义该
final
变量时指定了初始值。 - 该初始值可以在编译时就被确定下来。
编译器会将final直接量变量 直接 替换成对应的值
当定义final
变量时就为该变量指定了初始值,而且该初始值可以在编译时就确定下来,那么这个final
变量本质上就是一个”宏变量”,编译器会把程序中所有用到该变量的地方直接替换成该变量的值。
字符串直接量
Java
会使用常量池来管理曾经用过的字符串直接量,例如执行String a="java";
语句之后,常量池中就会缓存一个字符串"java"
;如果程序再次执行String b="java";
系统将会让b直接指向常量池中的"java"
字符串,因此a==b
将会返回true
。
final变量当成宏变量处理的情况
- 定义final变量时要直接赋值,赋值可以是一个简单的
直接量
,也可以是一个表达式
- 如果被赋的表达式只是
基本的算术表达式
或字符串连接运算
,则Java
编译器同样会将这种final
变量当成”宏变量”处理。
注意:如果赋值表达式包含了普通变量,或者调用了方法则不会当成”宏变量”处理.
对于final
实例变量而言,只有在定义该变量时指定初始值才会有”宏变量”的效果
实例
1 | public class FinalReplaceTest |
这个示例并不严谨,这本质上是String直接量
运行结果:
1 | true |
原文链接: 6.4.4 可执行 宏替换 的final变量