私人决赛场是否也应该是静态的?

时间:2014-06-01 17:18:27

标签: java static

我想知道,如果我在课堂上有这个字段:private final int foo = ...,我应该把它放在静态private static final int foo = ...吗?因为如果它是静态的,它对我班级的所有实例都是通用的,并且永远不会改变。

有没有理由不把它放在静态?或者我必须把它放在静态?

5 个答案:

答案 0 :(得分:5)

如果你的类的每个实例都应该具有foo的相同的不可变值,那么你应该使foo为final和static。如果你的类的每个实例都可以为foo提供不同的(但仍然是不可变的)值,那么该值应该是最终的。

但是,如果你的类的每个实例都应该具有相同的foo不可变值,那么它实际上是一个常量。按照惯例,通常编码如下:

private static final int FOO = ...

请注意大写字母表示常量......

答案 1 :(得分:3)

如果您在constructor中启动其值,那么它不应该是static

private final int foo;

public MyClass(int m){
    foo=m;
}

因为它的值取决于入门价值。


但是如果你像

那样内联它的价值
private final int foo = 100;

然后它首选只有static只有一个实例,因为final字段将在每个类实例上创建;但static将被创建一次。

答案 2 :(得分:1)

两个非访问修饰符之间存在很大差异。

  • final表示您的变量可以分配一次值。
  • static将其范围设置为与类相关(而不是实例或本地上下文)。

除非按照设计,否则没有理由将它们放在一起。

static final变量事实上 常量

例如,interface中声明的字段隐含publicstaticfinal

final的使用示例中,您可以找到非static字段:

  • 在匿名类之外声明并在其中引用的字段
  • 本地字段(在方法体中声明)在本地类中引用(在同一方法的主体中声明)
  • 等...

答案 3 :(得分:1)

这是一个常量,您不希望为该类的每个实例都有一个变量副本,因此请将其设置为静态。此外,如果要从静态方法中使用它们,请将其设置为静态。

静态变量是一个类的所有实例共有的变量。如果一个实例更改了它,那么将为所有其他实例更新静态变量的值。

如果您不想要此行为,请将其保持为非静态。

答案 4 :(得分:1)

构造函数仍然可以设置最终成员:因此,如果您的类的每个实例都可以在构造函数中设置foo,并且此值应仅适用于该实例,则它应该只是final,而不是static。

但是,如果foo仅在声明时设置,则可能意味着这是所有实例的公共值,并且通过将其声明为静态来赢得一点内存。请注意,如果foo不是基元而是引用成员,则final仅表示引用不能更改,而不是对象的内容,因此作为引用的最终和非静态成员不应自动为静态。对于每个类的实例,您可能需要一个不可变引用,具有不同的对象状态。