Java 私有final字段也应该是静态的吗?

Java 私有final字段也应该是静态的吗?,java,static,Java,Static,我想知道,如果我的类中有这个字段:private-final-int-foo=…,我应该把它放在staticprivate-static-final-int-foo=…中吗?因为如果它是静态的,它对我的类的所有实例都是公共的,并且永远不会改变 有没有理由不把它放在静态中?或者我必须将它放在静态中吗?如果类的每个实例都应该具有相同的foo不可变值,那么应该将foo设置为final和static。如果类的每个实例都可以有不同的(但仍然是不可变的)foo值,那么该值应该是final 但是,如果类的每个

我想知道,如果我的类中有这个字段:
private-final-int-foo=…
,我应该把它放在static
private-static-final-int-foo=…
中吗?因为如果它是静态的,它对我的类的所有实例都是公共的,并且永远不会改变


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

如果类的每个实例都应该具有相同的foo不可变值,那么应该将foo设置为final和static。如果类的每个实例都可以有不同的(但仍然是不可变的)foo值,那么该值应该是final

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

private static final int FOO = ...

注意大写表示常量…

如果类的每个实例都应该具有相同的foo不可变值,那么应该将foo设置为final和static。如果类的每个实例都可以有不同的(但仍然是不可变的)foo值,那么该值应该是final

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

private static final int FOO = ...

注意表示常量的大写…

如果在
构造函数中初始化它的值,那么它不应该是
静态的

private final int foo;

public MyClass(int m){
    foo=m;
}
因为它的值取决于入口值


但是如果你像这样初始化它的值

private final int foo = 100;

然后最好是
static
,只有一个实例,因为
final
字段将在类的每个实例上创建;但是
静态
将被创建一次。

如果您在
构造函数中初始化它的值
,那么它不应该是静态的

private final int foo;

public MyClass(int m){
    foo=m;
}
因为它的值取决于入口值


但是如果你像这样初始化它的值

private final int foo = 100;

然后最好是
static
,只有一个实例,因为
final
字段将在类的每个实例上创建;但是静态的
将被创建一次。

这两个非访问修饰符之间有很大的区别

  • final
    表示变量可以赋值一次
  • static
    将其范围设置为与类相关(而不是实例或本地上下文)
除非是有意的,否则他们没有理由走到一起

静态final
变量实际上是一个常量

例如,在
接口
中声明的字段隐式地为
公共
静态
最终

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

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

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

  • final
    表示变量可以赋值一次
  • static
    将其范围设置为与类相关(而不是实例或本地上下文)
除非是有意的,否则他们没有理由走到一起

静态final
变量实际上是一个常量

例如,在
接口
中声明的字段隐式地为
公共
静态
最终

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

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

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

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


如果不希望此行为,请将其保持为非静态。

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

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


如果不希望此行为,请将其保持为非静态。

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


然而,如果只在声明时设置foo,这可能意味着这是所有实例的一个公共值,并且通过声明它也是静态的,您将赢得一点内存。但是要注意,如果foo不是原语而是引用成员,final只意味着引用不能更改,而不是对象的内容,因此作为引用的final和非静态成员不应该自动是静态的。您可能希望类的每个实例都有一个不可变的引用,对象状态不同。

最终成员仍然可以由构造函数设置:因此,如果类的每个实例都可以在构造函数中设置foo,并且该值应该只属于该实例,那么它应该是最终的,而不是静态的

但是,如果只在声明时设置foo,则可能意味着这是一个常见的v