java中常量变量和最终变量之间有什么区别?

Swa*_*tap 15 java variables final constants

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

Lui*_*ese 26

常量是概念,变量的属性.

final 是声明常量变量的java关键字.


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

无论如何,引用规范,我们可以阅读

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

因此,我想,为了我们的目的,我们可以接受(并认为正确)这个二项式.

  • 你能说这个值在编译时是变量的,但在运行时是常量吗? (2认同)

Ami*_*Das 9

Constant 不是Java中的关键字.

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

  • 是的,但是不能改变`list`所持对象的状态可以算作*修改*?我知道这里的区别,但是当你发布一个旨在澄清一个混淆的答案时,你不应该通过引入新的混淆来做到这一点.因此,"没有人可以修改该变量的值",最好说*没有人可以将新值重新分配给最终变量*. (4认同)
  • 你是什​​么意思"没有人可以修改那个变量的价值."?如何`final List <String> list = new ArrayList <>(); list.add( "富");`?我正在通过向其添加新元素来修改ArrayList(由`final list`持有),因此人们可以认为我修改了`list`的值. (2认同)

Sak*_*tal 5

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

将变量声明为常量

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

int hoursInADay = 24;
Run Code Online (Sandbox Code Playgroud)

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

final int HOURS_IN_A_DAY = 24;
Run Code Online (Sandbox Code Playgroud)

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

如果现在尝试更改以下值HOURS_IN_A_DAY

final int HOURS_IN_A_DAY = 24; 
HOURS_IN_A_DAY = 36;
Run Code Online (Sandbox Code Playgroud)

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

无法将值分配给最终变量HOURS_IN_A_DAY

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

在哪里声明常量

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

public class Hours {
   public static final int HOURS_IN_A_DAY = 24;
}
Run Code Online (Sandbox Code Playgroud)

  • Java约定是所有大写名称保留给* static *最终变量使用。 (4认同)

sou*_*ung 5

使变量“ final”意味着我们不能为该变量重新赋值(即我们只能使用variable = Something 一次且只能使用一次)。

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

但最终变量可以是非常量。举个例子

final Stringbuffer string = new StringBuffer("not"); 
string.append(" constant");
System.out.println(string); 
Run Code Online (Sandbox Code Playgroud)

将打印字符串“not Constant”。这里的“字符串”变量是最终变量,但不是常量。我希望这个能帮上忙