【问题标题】:Why final variables are not constants Java? [duplicate]为什么 final 变量不是 Java 常量? [复制]
【发布时间】:2016-05-17 20:19:21
【问题描述】:

我知道这样声明的变量:

public class Example {
    public static final int MY_CONSTANT = 10;

}

被认为是一个 Java 常量。我真的不明白为什么不能将仅声明为 final 的变量视为常量?

【问题讨论】:

  • 我真的不明白为什么一个只声明为 final 的变量不能被认为是一个常量 你问的是不是用static 修改的?或者没有在声明时初始化?您能否澄清在哪种情况下您认为它不被视为常量?你的意思是 constant 是不变的还是你的意思是 constant 就像 JLS 中定义的 constant expression 一样?
  • 我已将此标记为另一个问题的副本,因为您问的是完全相同的问题,但我必须说我发现那里的答案相当不令人满意。特别是,JLS 表示“常量变量是原始类型的最终变量或使用常量表达式初始化的 String 类型(第 15.28 节)。”,其中没有提及static
  • @Andy Turner:是的,即使局部变量也可以是常量。如果您想玩得开心,可以在switch 语句中使用case 标签等局部常量,或在局部class 的注解中引用它们...

标签: java constants final


【解决方案1】:

一个最终但不是静态的变量对一个对象有一个常量值,这意味着它只能由该对象的构造函数修改。但是对于不同的对象,变量仍然可以有不同的值。这就是为什么它不是严格意义上的常数。

另一个原因是您不必创建对象来访问静态变量。为什么要创建对象才能访问常量?

【讨论】:

  • 如果在声明的时候赋值就不会有不同的值:final int myConstant = 10;.
  • @AndyTurner:是的,但是(在我知道的 IDE 中)如何分配值并不是很明显。对于static finals,很明显它们在整个程序中都有一个常数值。
  • @FrankPuffer 为什么更明显?在这两种情况下,您都必须检查代码或阅读文档。
  • @FrankPuffer 我可以想到一种从(static) final 字段中读取两个不同值的方法 - 您实际上可以在初始化它们之前读取它们(在特定情况下),因此您可以阅读“之前" 和 "after" 初始化值。所以在病理情况下,它们不是恒定的。
  • @SotiriosDelimanolis:当您选择变量时,大多数 IDE 会显示变量的类型(static final 或只是 final)。