常量折叠是jvm在底层进行常量的基本运算,比如
String s = "hello" + "world"; // 编译时直接折成 "helloworld"
再比如:
public class C {
public static final String A = "he";
public static final String B = "llo";
public static final String C = A + B; // 也会在编译时折成 "hello"
}
而
String str1 = "he"; // 普通局部变量,不是 compile-time constant
String str2 = "llo";
String str3 = "world";
// 这里 str1、str2、str3 都是变量,编译器无法在编译期把它们的值“提取”出来
String str4 = str1 + str2 + str3;
需要注意,由于字符串String的操作符+被重载了,所以才能进行常量折叠,因此String只有+的常量折叠,而对于八大基本数据类型没有这样的限制,比如:
// 以下都是编译期常量表达式,编译后直接折叠为字面量
int x = 1 + 2 * 3; // 折叠成 int x = 7;
long L = 100L / 4; // 折叠成 long L = 25L;
float f = 2.5f + 4.5f; // 折叠成 float f = 7.0f;
double d = 3.0 - 1.1; // 折叠成 double d = 1.9;
char c = 'A' + 2; // 折叠成 char c = 'C';
byte b = (byte)(1 + 2); // 折叠成 byte b = 3;
short s = (short)(10 - 4); // 折叠成 short s = 6;
boolean t = true && false; // 折叠成 boolean t = false;

被折叠的 条评论
为什么被折叠?



