2011-11-11 50 views
21

为什么java常量声明为静态?为什么java常量声明为静态?

class Foo{ 
    static final int FII = 2 ; 
} 

在这个我明白了最终的使用?为什么它必须是静态的?为什么它应该是一个类变量,而不是一个实例变量?

+8

为什么你想让不止一个实例拥有自己的'FII'副本? –

+1

我可以声明'final int FII = 2;'很好。 –

+0

@JonLin:你可以,但你不应该因为它没有增加价值,但只会增加内存使用。例外情况是在构造函数调用中初始化常量 - 然后每个实例都可以拥有自己的常量值(在构造函数运行之后是常量),并且可以具有类似'constructionTime'或类似值的值。 –

回答

26

如果它可能因班级的实例而异,那么它显然不是常数。对于Math的每个实例获得不同的pi值(这不意味着Math甚至允许构建实例)意味着什么?或者String的每个实例的不区分大小写排序?

12

它只是让您可以在没有该类的实例的情况下访问它们。

要求创建一个实例来访问常量字段会浪费资源。

76

如果一个常量不是静态的,Java将为该类的每个对象(即每个对象的常量的一个副本)为该常量分配一个内存。

如果常量是静态的,那么该类的常量只有一个副本(即每个类一个副本)。

因此,如果该常量只有一个值,则应声明为静态。

如果常量可能对每个对象具有不同的值,例如对象的创建时间,则不应将其声明为静态。

+4

非常好的和技术性的答案,非常感谢。 –

相关问题