【发布时间】:2021-01-02 05:56:42
【问题描述】:
我在书中读过这句话,但我不明白:
一个既是静态又是最终的字段只有一个不能更改的存储。
谁能帮我解释一下?
【问题讨论】:
-
请注意,
final也有并发实现。final字段保证是线程安全的,而其他字段则不是。请参阅:我的回答:stackoverflow.com/questions/3974350/…
标签: java
我在书中读过这句话,但我不明白:
一个既是静态又是最终的字段只有一个不能更改的存储。
谁能帮我解释一下?
【问题讨论】:
final 也有并发实现。 final 字段保证是线程安全的,而其他字段则不是。请参阅:我的回答:stackoverflow.com/questions/3974350/…
标签: java
你困惑的根源可能是英文中的“static”这个词和它在Java中的含义只是松散的相关。
以“正常”方式在 Cat 类中定义的变量可以称为实例变量。
class Cat {
int weight;
}
每次创建 Cat 类型的新对象时,都会创建变量“weight”的新副本。如果您创建 10 个 Cat 类型的对象,每个对象都有自己的权重变量副本。
“静态”变量可以被认为是类级别的变量,而不是实例变量。静态变量只有一个副本并且属于 Cat 类本身,而不是 Cat 类型的 每个 对象都有一个副本。
class Cat {
static String speciesName;
int weight;
}
这里,无论我们创建多少 Cat 类型的对象,都只有一个 speciesName 副本。
如果静态变量也是“最终的”,则该变量的这一副本是唯一不能更改的存储部分。如果在上面的示例中变量“权重”是最终的,那么将有 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 变量描述为只能分配一次的变量(对于类成员,这需要在构造函数中)。
static final 变量实际上是一个常量。但是,Jonas 的答案的原始措辞将 final 变量称为常量,我不认为这是一个准确的措辞选择,因为类的不同实例对于最终变量可能具有不同的值。
有关此页面的说明,请参阅“常量”部分:
http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html
【讨论】:
【讨论】: