私有最终静态属性与私有最终属性
2022-08-31 04:57:40
在Java中,两者之间有什么区别:
private final static int NUMBER = 10;
和
private final int NUMBER = 10;
两者都是 和 ,区别在于属性。private
final
static
什么更好?为什么呢?
在Java中,两者之间有什么区别:
private final static int NUMBER = 10;
和
private final int NUMBER = 10;
两者都是 和 ,区别在于属性。private
final
static
什么更好?为什么呢?
通常,表示 “与类型本身相关联,而不是与类型的实例相关联”。static
这意味着您可以在不创建该类型的实例的情况下引用静态变量,并且引用该变量的任何代码都引用完全相同的数据。将其与实例变量进行比较:在这种情况下,每个类的实例都有一个独立版本的变量。例如:
Test x = new Test();
Test y = new Test();
x.instanceVariable = 10;
y.instanceVariable = 20;
System.out.println(x.instanceVariable);
打印出 10:并且是分开的,因为和引用不同的对象。y.instanceVariable
x.instanceVariable
x
y
您可以通过引用来引用静态成员,尽管这样做是一个坏主意。如果我们这样做了:
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通常会建议将第二个列表更改为第三个列表。
没有理由像下面这样使用内联声明初始化值,因为每个实例都有自己的,但始终具有相同的值(不可变并使用文本初始化)。这与所有实例只有一个变量相同。NUMBER
final 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;
}
现在,对于 的每个实例,我们可以有一个不同但不可变的值。MyClass
number
变量在应用程序的整个生存期内一直保留在内存中,并在类加载期间进行初始化。每次构造对象时都会初始化非变量。通常最好使用:static
static
new
private static final int NUMBER = 10;
为什么?这减少了每个实例的内存占用量。它也可能有利于缓存命中。这是有道理的:应该用于在特定类型(又名)的所有实例(又名对象)之间共享的东西。static
class