final 使用
(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 ) |