2011-09-27 116 views
34

可能重复:
private final static attribute vs private final attribute静态最终变量

什么是变量声明为

static final int x = 5; 

final int x = 5; 
之间的区别

如果我只想将变量设为本地,并且常量(以后不能更改)?

谢谢

+2

如果这是一个变量(而不是字段),它根本不能是静态的。 – Thilo

+0

这已经在此[问题]中讨论过(http://stackoverflow.com/questions/1415955/private-final-static-attribute-vs-private-final-attribute)。 –

+0

这与当前标记不重复。这个问题是关于在方法局部变量中使用“static final”的问题,链接问题将它用作类/对象变量(在任何方法定义之外)。我认为答案是,在方法中使用“final”可以做到人们可能期望的“静态最终”在大多数情况下在这种情况下做的事情。然而,我想知道如果它是一个对象而不是一个整数,如果可变性可能产生不同于这种直觉的结果。我没有测试过这个。有人知道吗? – Apriori

回答

31

只是最后会有预期的效果。

声明静态正在成为一个类变量,这将是通过类名<ClassName>.x.

5

在第一条语句定义变量,它通用于所有对象(类静态字段)进行访问。

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

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

29

声明的字段作为“最终”将确保字段是一个常数,不能改变。 区别在于使用'static'关键字。

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

正如你所看到的,你的要求,即场应该是恒定的在这两种情况下(声明字段“最终”和“静最终”)的实现。

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

希望它可以帮助

3

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

见帕维尔对正确答案的响应。