贝利信息

在Java中final关键字如何影响类方法与变量_Java不可变设计说明

日期:2026-01-14 00:00 / 作者:P粉602998670
final修饰变量仅保证引用不可变而非对象不可变;修饰方法禁止重写但允许重载;修饰类禁止继承且隐含所有方法final;final是不可变的必要非充分条件,需配合深拷贝和不可变视图。

final修饰变量:值不可变 ≠ 对象不可变

声明为 final 的变量只能赋值一次,但若其类型是引用类型(如 ArrayListStringBuilder),变量本身不可重新指向其他对象,而对象内部状态仍可修改。

final修饰方法:禁止子类重写,但不影响重载

final 方法在运行时不会被动态绑定覆盖,JVM 可能对其内联优化;它不阻止同名不同参的重载,也不影响静态分派逻辑。

final修饰类:彻底关闭继承链

类被声明为 final 后,任何 extends 尝试都会在编译期报错;这也隐含意味着该类所有方法自动成为 final(即使没显式写),但字段仍可按需声明为 final 或非 final

不可变设计中 final 的真实作用边界

fi

nal 是不可变(immutability)的必要非充分条件。它只约束“引用不可变”或“结构不可扩展”,不保证深层状态安全。

public final class Config {
    private final Map props;

    public Config(Map input) {
        // 错误:props = input;
        this.props = Collections.unmodifiableMap(new HashMap<>(input));
    }

    public Map getProps() {
        return props; // 安全:不可修改副本
    }
}

很多人卡在“用了 final 就等于不可变”这层直觉上——其实 final 只锁住了引用和继承路径,真正的不可变需要整条构造与访问链都配合防御策略。