2016-05-17 123 views
-2

我知道,一个变量声明如下:为什么最终变量不是常量Java?

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

} 

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

+3

_我真的不明白为什么只声明最终的变量不能被认为是一个常量_你是问,而不是用'static'修改吗?或者没有在声明中初始化?你能否澄清在哪种情况下你不认为它被认为是_constant_?你的意思是_constant_是不变的,还是你的意思是_constant_在JLS中定义的_constant expression_中? –

+2

我已经标记为另一个问题的副本,因为您问的是完全相同的问题,但我必须说我找到的答案相当令人满意。特别是,[JLS](https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4)说:“一个常量变量是最终变量原始类型或类型的字符串,它使用常量表达式(第15.28节)进行初始化“,它没有提及”静态“。 –

+0

@Andy Turner:是的,即使局部变量也可以是常量。如果你想获得乐趣,你可以在'switch'语句中使用'case'标签中的局部常量,或者在本地'class'的注释中引用它们...... – Holger

回答

0

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

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

+3

如果它被赋值为值声明时:'final int myConstant = 10;'。 –

+0

@AndyTurner:没错,但它并不是真的很明显(在我所知道的IDE中)这个值是如何分配的。对于'static final's来说,显然它们在整个程序中都有一个恒定的值。 –

+0

@FrankPuffer为什么更明显?在这两种情况下,您都必须检查代码或阅读文档。 –