关于 Java 中的静态最终关键字

2022-09-01 00:21:48

根据教程

修饰符与修饰符结合使用也用于定义常量。修饰符指示此字段的值无法更改。staticfinalfinal

只有当所涉及的类型是原始的时,我才会同意这一点。对于引用类型,例如,一个类的位置属性不是的实例(即,我们可以更改其位置),这种变量的属性仍然可以更改。这是真的吗?Point2Dfinalpublic static final Point2D A = new Point2D(x,y);


答案 1

是的,可以更改。只有引用不能更改,但其内部字段可以更改。下面的代码演示了它:

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的注释,它阻止在构造对象后将其更改为内部状态。


答案 2

正确,它仍然可以更改。在这种情况下,“静态最终”是指引用本身,无法更改。但是,如果它引用的对象是可变的,则可以更改它所引用的对象。

不可变对象(如 String)将是一个常量。


推荐