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

Ank*_*ava -2 java compile-time-constant

final int i=10;
final String s=new String("lkj");
Run Code Online (Sandbox Code Playgroud)

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

JB *_*zet 5

因为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构造函数创建字符串,将字符串作为参数".

无论如何都没有理由调用那个构造函数(它应该被弃用,恕我直言).