分析 Java Compile-time Constant(编译时常量)

前言

最近被这个概念迷惑住了,翻看中文博客大多没有讲的太清楚,最后多方查阅终于搞清楚,特此记录,希望对别人有帮助。

编译时常量定义是否一定需要static修饰?

如果你看别人写的编译时常量例子,很多人都会这样定义:

public static final int variale = 1;

那么这里的static是否为必需的呢?

其实,final为必需,static为非必需。如果你懂得了编译器对编译时常量的处理,就会知道final为必需是有原因的,而static并没有什么特殊原因一定要写。

编译器对于检测到的编译时常量进行这样的处理:将所有出现该编译时常量的地方直接替换为该变量声明时赋给的值。

final int var = 1; //compile-time constant

int another = var; //等效于int another = 1;

那么要求用final修饰的意义就很明显了。如果不用final修饰,变量在程序后续部分改变了它最初的值,但是编译器这时候早已将所有出现该变量的地方替换为它最初的值,那么该变量值的改变便是无意义的。

int var = 1; //假设var为编译时常量
int another = var;
var = 2;
int another1 = var; //程序员原意这里应该为another1 = 2;
/*如果var按编译时常量处理,上述代码等效于*/
int var = 1;
int another = 1;
var = 2;
int another1 = 1;

变量成为编译时常量的四个条件

  • 使用final修饰
  • 变量必须为基本类型或String类型
  • 变量必须在声明的同时进行赋值
  • 对变量进行赋值的必须为常量表达式(constant expression)

常量表达式(Constant expression)

对于常量表达式,你可以这样快速记忆:它是一个不包括自增自减运算符,不包括instanceof运算符和任何方法调用的表达式(注:常量表达式可以是常量的引用)。

更具体的定义如下(注意最后两条):

https://docs.oracle.com/javase/specs/jls/se10/html/jls-15.html#jls-15.28

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值