Java中的静态最终变量[重复]

Posted

技术标签:

【中文标题】Java中的静态最终变量[重复]【英文标题】:Static Final Variable in Java [duplicate] 【发布时间】:2011-11-25 16:37:13 【问题描述】:

可能重复:private final static attribute vs private final attribute

将变量声明为有什么区别

static final int x = 5;

final int x = 5;

如果我只想让变量是局部的,并且是常量(以后不能更改)?

谢谢

【问题讨论】:

如果这是一个变量(而不是一个字段),它根本不可能是静态的。 这个question之前已经讨论过了。 这不是当前标记的重复项。这个问题是询问如何将“静态最终”与方法局部变量一起使用,链接的问题是将其用作类/对象变量(在任何方法定义之外)。我认为答案是,在方法中使用“final”可以在大多数情况下完成人们可能期望“static final”在该上下文中执行的操作。但是,我想知道它是否是一个对象而不是一个 int,如果可变性可能会产生与这种直觉不同的结果。我没有测试过这个。有人知道吗? 【参考方案1】:

只要有final 就会有预期的效果。

final int x = 5;

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

声明静态使其成为类变量,使其可以使用类名<ClassName>.x进行访问

【讨论】:

【参考方案2】:

将字段声明为“final”将确保该字段是常量且不能更改。 不同之处在于“静态”关键字的使用。

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

如您所见,在这两种情况下(将字段声明为“final”和“static final”)都满足了您对字段应为常量的要求。

类似的问题是private final static attribute vs private final attribute

希望对你有帮助

【讨论】:

【参考方案3】:

在第一个语句中定义变量,它对所有对象都是通用的(类静态字段)。

在第二个语句中定义变量,它属于每个创建的对象(很多副本)。

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

【讨论】:

【参考方案4】:

对于原始类型,“最终静态”将是声明常量的正确声明。当非静态最终变量是对对象的常量引用时,它才有意义。在这种情况下,每个实例都可以包含自己的引用,如JLS 4.5.4 所示。

请参阅 Pavel 的回复以获取正确答案。

【讨论】:

以上是关于Java中的静态最终变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在我们的应用程序中最好使用静态最终变量或最终变量[重复]

最终静态变量及其使用[重复]

Java中的覆盖和隐藏以及final关键字

为啥接口变量默认是静态的和最终的?

为啥java中的serialVersionUID必须是静态的、最终的和long类型的? [复制]

非静态最终变量在 Java 中有用吗?