(1) final 变量(常量)
-
局部变量:一旦赋值,不可修改
-
成员变量:必须在声明时或构造方法中初始化
-
静态变量:必须在声明时或静态代码块中初始化
final int x = 10; // 局部 final 变量
x = 20; // 编译错误!不能重新赋值
class MyClass {
final int y; // final 成员变量
final static int Z; // final 静态变量
static {
Z = 100; // 静态代码块初始化
}
public MyClass() {
y = 20; // 构造方法初始化
}
}
关键点:
-
基本类型:值不可变(如
final int x = 10
) -
引用类型:引用不可变,但对象内部状态可能可变(如
final List<String> list = new ArrayList<>()
仍可add()
)
(2) final 方法(不可重写)
-
子类不能重写
final
方法 -
用途:防止继承破坏关键逻辑(如
Object.getClass()
)
示例:
class Parent {
public final void show() {
System.out.println("Parent's final method");
}
}
class Child extends Parent {
// @Override // 编译错误!不能重写 final 方法
public void show() { }
}
注意:private
方法隐式是 final
的,因为子类无法访问。
(3) final 类(不可继承)
-
该类不能被继承(如
String
、Integer
等核心类) -
用途:保证类的行为不被修改,增强安全性
final class ImmutableClass { }
// class SubClass extends ImmutableClass { } // 编译错误!
总结
场景 | 作用 | 典型用例 |
---|---|---|
final 变量 | 防止重新赋值 | 常量、方法参数、共享数据 |
final 方法 | 禁止子类重写 | 模板方法模式、关键算法 |
final 类 | 禁止继承 | 工具类、核心不可变类(如 String ) |