编译期常量是在编译阶段就能确定值并嵌入字节码的final基本类型或String变量,需满足声明即初始化、类型合法、表达式为常量表达式四条件,影响赋值、switch、字符串优化等行为。

编译期常量(Compile-time Constant)是指在代码编译阶段就能完全确定其值、且该值被直接嵌入字节码的常量。它不是运行时才计算出来的,而是由编译器在编译时“固化”下来的值。这类常量能参与编译优化,比如方法内联、条件剪枝、类型窄化赋值等。
一个变量要被Java编译器认定为编译期常量,必须同时满足以下四点:
final 修饰,不可重新赋值byte/short/int/long/char/float/double/boolean 和 String;不能是其他引用类型(如 Integer、ArrayList 等)final int x;,再在构造器中赋值)+ - * / % & ^ | > >= == != && || ?:)、括号以及对其他编译期常量的引用下面这些写法能被识别为编译期常量:
final int MAX = 100; ✅ 字面量直接初始化final String NAME = "Java"; ✅ String 字面量final long SIZE = 1024L * 1024; ✅ 常量表达式(乘法+字面量)final char FLAG = 'A' + 1; ✅ 字符字面量参与常量运算,结果仍是常量final byte B = (byte)(127 + 1); ✅ 强制类型转换 + 常量表达式(但注意:若超出 byte 范围会编译失败)而这些写法不是编译期常量:
立即学习“Java免费学习笔记(深入)”;
final int x; x = 5; ❌ 空白 final,未在声明处初始化final Integer Y = 10; ❌ 是包装类,非基本类型或 Stringfinal double PI = Math.PI; ❌ Math.PI 是运行时静态字段,非字面量或常量表达式final int Z = someMethod(); ❌ 方法调用无法在编译期求值final int A = a + b;(其中 a、b 是普通变量)❌ 含非常量变量,表达式不满足常量表达式定义它不只是语义概念,会直接影响编译行为和运行表现:
final int x = 100; → byte b = x; 合法(因为编译器确认 100 在 byte 范围内);但换成普通变量就会报错switch 支持 String 和枚举,但分支 case 值仍需是编译期常量"Hello" + "World" 在编译期合并为 "HelloWorld";若其中任一操作数是非编译期常量(如 final String s = getStr();),则拼接推迟到运行时基本上就这些。关键不在“是不是 final”,而在于“能不能在编译那一刻算出唯一确定的值”。
以上就是在Java中什么是编译期常量_Java编译期常量的判定规则解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号