我在一本书中读到了这个句子,但我不太理解:
既是静态的又是最终的字段只有一个不可更改的存储空间。
可以有人为我解释一下吗?
class Cat {
int weight;
}
每次创建 Cat 类型的新对象时,都会创建变量“weight”的新副本。如果创建 10 个 Cat 对象,则每个对象都有自己的 weight 变量副本。class Cat {
static String speciesName;
int weight;
}
无论我们创建多少个Cat类型的对象,这里只有一个speciesName的副本。
如果静态变量也是“final”的话,那么这个变量的唯一一个副本是唯一不能被更改的存储空间。如果在上面的例子中变量'weight'是final的,那么将会有10个不能被更改的存储空间,对应于我们创建的每个Cat类型的对象。
static
变量对于类的所有实例都是共同的。final
变量在第一次设置后无法更改。
因此,在Java中,static final
变量对于类的所有实例都是共同的,并且在第一次设置后无法更改。
class Car {
static final int numberOfWheels = 4;
Color color;
public Car(Color color) {
this.color = color;
}
}
Car redCar = new Car(Red);
Car blueCar = new Car(Blue);
每辆车现在都拥有一个独立的且可变的属性color
,它们共享属性numberOfWheels
,但这个属性是不可更改的。
final
变量为“常量”,因为这个术语通常用于编译时变量或在声明时分配的变量。相反,我会将final
变量描述为只能被赋值一次的变量(对于类成员来说,这需要在构造函数中完成赋值)。 - Brianstatic final
变量实际上是一个常量。然而,Jonas的回答最初的措辞将final
变量称为常量,我认为这不是一个准确的措辞选择,因为类的不同实例可以有不同的final
变量值。 - Brianstatic final
基本上是一个常量,就像你提供的链接所示。然而,单独使用 final
或 static
并不会创建一个常量变量。 - Brian
final
还有并发实现。final
字段在某种程度上保证了线程安全性,而其他字段则没有。查看:我的答案在这里:https://dev59.com/DFHTa4cB1Zd3GeqPP0T3#3974372 - andersoj