Java中的静态常量变量

40

2
如果这是一个变量(而不是字段),它根本不能是静态的。 - Thilo
这个问题以前在这个问题中讨论过了。 - Benjamin Muschko
这不是当前标记的重复项。此问题询问如何在方法局部变量中使用“static final”,而链接的问题将其用作类/对象变量(在任何方法定义之外)。我认为答案是,在方法内部使用“final”通常情况下会产生预期的“static final”效果。但是,如果它是一个对象而不是int,是否可变可能会产生与这种直觉不同的结果。我还没有测试过。有人知道吗? - Apriori
4个回答

39

只使用 final 就可以达到预期的效果。

final int x = 5;

...
x = 10; // this will cause a compilation error because x is final

声明静态变量将其转换为类变量,使得可以使用类名 <ClassName>.x 访问它。


37

将字段声明为“final”将确保该字段是常量并且不能更改。而“static”关键字的使用则有所不同。

将字段声明为静态意味着它与类型相关联,而不是与实例相关联。也就是说,所有对象只有一个字段副本而非每个对象都有一个副本。因此,可以通过类名访问静态字段。

正如您所看到的,在两种情况下(将字段声明为“final”和 “static final”),都可以实现字段应为常量的要求。

类似的问题请参见private final static attribute vs private final attribute

希望这可以帮助您。


6

第一条语句中,您定义了一个变量,该变量对所有对象都通用(类静态字段)。

第二条语句中,您定义了一个变量,该变量属于每个创建的对象(许多副本)。

在您的情况下,应使用第一个。


3

对于原始类型,"final static"将是一个适当的声明来声明一个常量。当它是一个指向对象的常量引用时,一个非静态的final变量是有意义的。在这种情况下,每个实例都可以包含自己的引用,如JLS 4.5.4所示。

查看Pavel的回答获取正确答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接