私有最终静态属性与私有最终属性

2022-08-31 04:57:40

在Java中,两者之间有什么区别:

private final static int NUMBER = 10;

private final int NUMBER = 10;

两者都是 和 ,区别在于属性。privatefinalstatic

什么更好?为什么呢?


答案 1

通常,表示 “与类型本身相关联,而不是与类型的实例相关联”。static

这意味着您可以在不创建该类型的实例的情况下引用静态变量,并且引用该变量的任何代码都引用完全相同的数据。将其与实例变量进行比较:在这种情况下,每个类的实例都有一个独立版本的变量。例如:

Test x = new Test();
Test y = new Test();
x.instanceVariable = 10;
y.instanceVariable = 20;
System.out.println(x.instanceVariable);

打印出 10:并且是分开的,因为和引用不同的对象。y.instanceVariablex.instanceVariablexy

您可以通过引用来引用静态成员,尽管这样做是一个坏主意。如果我们这样做了:

Test x = new Test();
Test y = new Test();
x.staticVariable = 10;
y.staticVariable = 20;
System.out.println(x.staticVariable);

然后这将打印出20 - 只有一个变量,而不是每个实例一个。如果写成这样会更清楚:

Test x = new Test();
Test y = new Test();
Test.staticVariable = 10;
Test.staticVariable = 20;
System.out.println(Test.staticVariable);

这使得行为更加明显。现代IDE通常会建议将第二个列表更改为第三个列表。

没有理由像下面这样使用内联声明初始化值,因为每个实例都有自己的,但始终具有相同的值(不可变并使用文本初始化)。这与所有实例只有一个变量相同。NUMBERfinal static

private final int NUMBER = 10;

因此,如果它不能更改,则每个实例有一个副本是没有意义的。

但是,如果在这样的构造函数中初始化,则有意义:

// No initialization when is declared
private final int number;

public MyClass(int n) {
   // The variable can be assigned in the constructor, but then
   // not modified later.
   number = n;
}

现在,对于 的每个实例,我们可以有一个不同但不可变的值。MyClassnumber


答案 2

变量在应用程序的整个生存期内一直保留在内存中,并在类加载期间进行初始化。每次构造对象时都会初始化非变量。通常最好使用:staticstaticnew

private static final int NUMBER = 10;

为什么?这减少了每个实例的内存占用量。它也可能有利于缓存命中。这是有道理的:应该用于在特定类型(又名)的所有实例(又名对象)之间共享的东西。staticclass


推荐