我知道,一个变量声明如下:为什么最终变量不是常量Java?
public class Example {
public static final int MY_CONSTANT = 10;
}
被认为是一个Java不变。我不明白为什么只声明final的变量不能被认为是一个常量?
我知道,一个变量声明如下:为什么最终变量不是常量Java?
public class Example {
public static final int MY_CONSTANT = 10;
}
被认为是一个Java不变。我不明白为什么只声明final的变量不能被认为是一个常量?
最终但非静态的变量对于一个对象具有常量值,这意味着它只能由该对象的构造函数修改。但对于不同的对象,变量可能仍然有不同的值。这就是为什么它不是严格意义上的常数。
另一个原因是你不必创建一个对象来访问一个静态变量。为什么要创建一个对象来访问一个常量?
如果它被赋值为值声明时:'final int myConstant = 10;'。 –
@AndyTurner:没错,但它并不是真的很明显(在我所知道的IDE中)这个值是如何分配的。对于'static final's来说,显然它们在整个程序中都有一个恒定的值。 –
@FrankPuffer为什么更明显?在这两种情况下,您都必须检查代码或阅读文档。 –
_我真的不明白为什么只声明最终的变量不能被认为是一个常量_你是问,而不是用'static'修改吗?或者没有在声明中初始化?你能否澄清在哪种情况下你不认为它被认为是_constant_?你的意思是_constant_是不变的,还是你的意思是_constant_在JLS中定义的_constant expression_中? –
我已经标记为另一个问题的副本,因为您问的是完全相同的问题,但我必须说我找到的答案相当令人满意。特别是,[JLS](https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4)说:“一个常量变量是最终变量原始类型或类型的字符串,它使用常量表达式(第15.28节)进行初始化“,它没有提及”静态“。 –
@Andy Turner:是的,即使局部变量也可以是常量。如果你想获得乐趣,你可以在'switch'语句中使用'case'标签中的局部常量,或者在本地'class'的注释中引用它们...... – Holger