【问题标题】:Why it is not compile time constant?为什么它不是编译时间常数?
【发布时间】:2017-06-24 07:53:45
【问题描述】:
final int i=10;
final String s=new String("lkj");

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

【问题讨论】:

  • 因为在这种情况下字符串变量存储的是引用而不是值(参见“new”关键字)。所以每次运行程序时,引用值都是不同的。
  • JB Nizet 5,这是一个完美的答案,而不仅仅是评论。
  • @RoundSauce3 不,这不是原因。如果你使用final String s = "ljk",那么s 是一个常量表达式,尽管它也是一个字符串对象的引用。
  • 所以我猜答案是“因为他们喜欢它”。 :P

标签: java compile-time-constant


【解决方案1】:

因为the JLS是这么说的:

常量表达式是表示原始类型值或字符串的表达式,它不会突然完成并且仅使用以下内容组成:

  • 原始类型的文字和字符串类型的文字(§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 构造函数以文字 String 作为参数创建的字符串”。

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

【讨论】:

  • 最终 String s="ll";编译时间常数
  • "ll" 是一个常量表达式,如果这就是你要问的,因为它是一个字符串文字。如果你有一个带有static final String s = "ll" 的类,那么s 是一个编译时常量。
【解决方案2】:

因为编译时没有常量。在创建字符串的新实例后在运行时调用它时会有一个值。

通常:使用“new”将创建一个新的实例。而且实例不是类,而是运行时的对象。

【讨论】:

  • String s="ll";编译时间常数
  • 是的。这是一个像 JB Nizet 描述的文字字符串。
猜你喜欢
  • 2022-01-25
  • 2013-11-25
  • 1970-01-01
  • 2020-12-16
  • 2012-10-19
  • 2011-10-14
  • 2020-03-10
  • 2012-08-31
  • 2014-08-25
相关资源
最近更新 更多