【问题标题】:What is the difference between constant variables and final variables in java?java中的常量变量和最终变量有什么区别?
【发布时间】:2015-08-13 06:22:17
【问题描述】:

请帮助我理解Java中常量变量和final变量之间的区别。我有点困惑。

【问题讨论】:

  • 常量变量是什么意思? 常量怎么可能是变量
  • 这不是标记问题的重复..
  • @Ichiro 我支持你。我投票决定重新开放它。 OP 根本没有询问任何关于静态的问题。如果 Java 有类似 const 的东西,以及它们是否与 final 有任何关系,他会感到困惑。

标签: java variables constants final


【解决方案1】:

常数是概念,是变量的属性。

final是java关键字声明一个常量变量。


正如其他人指出的那样,从语义/语言的角度来看,常量变量这个表达式是矛盾的,因此,我们可以争论它的正确性。

引用specification,反正我们可以阅读

原始类型的变量 [...] 是 final 并使用编译时常量表达式(第 15.28 节)进行初始化,称为常量变量

因此,我想我们可以接受(并认为是正确的)这个二项式来达到我们的目的。

【讨论】:

  • 你能说这个值在编译时是可变的,而在运行时是不变的吗?
【解决方案2】:

现实世界中有几个永远不会改变的价值观。正方形总是有四个边,PI 到小数点后三位总是 3.142,一天总是有 24 小时。这些值保持不变。在编写程序时,以相同的方式表示它们是有意义的——作为一旦分配给变量就不会被修改的值。这些变量称为常量。

将变量声明为常量

在声明变量时,我展示了为 int 变量赋值很容易:

int hoursInADay = 24;

我们知道这个值在现实世界中永远不会改变,所以我们确保它不会出现在程序中。这是通过添加关键字修饰符final来完成的:

final int HOURS_IN_A_DAY = 24;

除了final 关键字之外,您应该注意到变量名称的大小写已根据标准Java 命名约定更改为大写。这样可以更容易地发现代码中哪些变量是常量。

如果我们现在尝试更改HOURS_IN_A_DAY 的值:

final int HOURS_IN_A_DAY = 24; 
HOURS_IN_A_DAY = 36;

我们将从编译器得到以下错误:

无法为最终变量 HOURS_IN_A_DAY 赋值

对于任何其他原始数据类型变量也是如此。要将它们变成常量,只需在它们的声明中添加 final 关键字即可。

在哪里声明常量

与普通变量一样,您希望将常量的范围限制在使用它们的位置。 如果仅在方法中需要常量的值,则在其中声明它:

public class Hours {
   public static final int HOURS_IN_A_DAY = 24;
}

【讨论】:

  • Java 约定是为 static 最终变量保留全大写名称。
【解决方案3】:

Constant 不是 Java 中的关键字。

使任何变量保持不变是一个概念。为此,我们在 Java 中使用 final 关键字,以便在使用 final 关键字初始化变量后,没有人可以重新分配该变量的值。

【讨论】:

  • “没有人可以修改该变量的值”是什么意思? final List<String> list = new ArrayList<>(); list.add("foo"); 怎么样?我正在通过添加新元素来修改 ArrayList(由 final list 持有),因此人们可以认为我修改了 list 的值。
  • @Pshemo 您正在向该列表添加一个新对象。您不会像这样再次分配它 - List list1 = new ArrayList(); list = list1;
  • 可以,但是不能改变list持有的对象的状态可以算作修改?我知道这里的区别,但是当您发布一个旨在澄清一种混淆的答案时,您不应该通过引入新的混淆来做到这一点。因此,与其说“没有人可以修改该变量的值”,不如说没有人可以为最终变量重新分配新值
  • 更细微的差异,使这一点变得很清楚。感谢@Pshemo 坚持广告感谢 Amit Das 的回答并承认这里有一点。
【解决方案4】:

使变量“final”意味着我们不能为这个变量重新赋值(即我们可以使用variable = Something一次且仅一次。

所以对于原始变量,我们可以说最终变量是常量。

但最终变量可以是非常数。 例如

final Stringbuffer string = new StringBuffer("not"); 
string.append(" constant");
System.out.println(string); 

将打印字符串“not constant”。这里“字符串”变量是最终的,但不是恒定的。 我希望这会有所帮助

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2011-03-14
    • 2016-07-19
    • 2015-05-19
    • 1970-01-01
    相关资源
    最近更新 更多