final int i=10;
final String s=new String("lkj");
为什么第一个是编译时常量但第二个不是编译时常量,即使final也与第二个一起使用?
答案 0 :(得分:5)
因为the JLS这样说:
常量表达式是表示基本类型值的表达式或不突然完成的字符串,仅使用以下内容组成:
- String类型的原始类型和文字的文字(§3.10.1,§3.10.2,§3.10.3,§3.10.4,§3.10.5)
- 转换为基本类型并转换为String类型(第15.16节)
- 一元运算符+, - ,〜,和! (但不是++或 - )(§15.15.3,§15.15.4,§15.15.5,§15.15.6)
- 乘法运算符*,/和%(§15.17)
- 加法运算符+和 - (§15.18)
- [......其他情况]
但是没有一个案例说“通过调用String构造函数创建字符串,将字符串作为参数”。
无论如何都没有理由调用该构造函数(并且它应该被弃用,恕我直言)。
答案 1 :(得分:0)
因为在编译时没有常量。在创建新的字符串实例后,在运行时调用它时会有一个值。
一般来说:使用" new"将创建一个新的实例。并且实例不是类,而是运行时的对象。