关于 Java 中的静态最终关键字
根据教程:
修饰符与修饰符结合使用也用于定义常量。修饰符指示此字段的值无法更改。
static
final
final
只有当所涉及的类型是原始的时,我才会同意这一点。对于引用类型,例如,一个类的位置属性不是的实例(即,我们可以更改其位置),这种变量的属性仍然可以更改。这是真的吗?Point2D
final
public static final Point2D A = new Point2D(x,y);
根据教程:
修饰符与修饰符结合使用也用于定义常量。修饰符指示此字段的值无法更改。
static
final
final
只有当所涉及的类型是原始的时,我才会同意这一点。对于引用类型,例如,一个类的位置属性不是的实例(即,我们可以更改其位置),这种变量的属性仍然可以更改。这是真的吗?Point2D
final
public static final Point2D A = new Point2D(x,y);
是的,可以更改。只有引用不能更改,但其内部字段可以更改。下面的代码演示了它:
public class Final {
static final Point p = new Point();
public static void main(String[] args) {
p = new Point(); // Fails
p.b = 10; // OK
p.a = 20; // Fails
}
}
class Point {
static final int a = 10;
static int b = 20;
}
Groovy(另一种JVM语言)有一个名为@Immutable的注释,它阻止在构造对象后将其更改为内部状态。
正确,它仍然可以更改。在这种情况下,“静态最终”是指引用本身,无法更改。但是,如果它引用的对象是可变的,则可以更改它所引用的对象。
不可变对象(如 String)将是一个常量。