为什么它不是编译时间常数?

时间:2017-06-24 07:53:45

标签: java compile-time-constant

final int i=10;
final String s=new String("lkj");

为什么第一个是编译时常量但第二个不是编译时常量,即使final也与第二个一起使用?

2 个答案:

答案 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"将创建一个新的实例。并且实例不是类,而是运行时的对象。