final 关键字详解
在 Java 中,final是一个重要的关键字,可用于修饰变量、方法和类,分别赋予它们不同的特性。下面详细解析其用法和特性:
final 修饰方法
核心作用
final修饰的方法不允许被子类重写,从而保证方法行为的稳定性。
特殊说明
- 类中所有
private方法默认隐式为final。因为private方法只能在当前类中访问,子类无法继承,自然无法重写。 - 若子类中定义了与父类
private方法同名的方法,这并非重写,而是子类新定义的方法,编译不会报错。
优势
- 行为一致性:防止子类通过重写改变核心方法的逻辑。
- 性能优化:
- 编译器可对
final方法进行静态绑定(无需运行时动态解析方法调用)。 - 可能触发内联优化:用方法体代码直接替换调用处,减少方法调用的栈操作开销。
- 编译器可对
final 修饰类
核心作用
final修饰的类不允许被继承,即该类没有子类。
典型案例
Java 中的String类就是final类,保证了字符串的不可变性和安全性,避免被继承后修改其核心行为。
使用场景
当类的设计不希望被扩展,或类的逻辑不适合被修改时(如工具类、基础组件),可声明为final。
final 修饰变量
final修饰的变量为常量,一旦赋值后不可修改。其初始化规则因变量类型(实例变量 / 类变量)而异。
final 实例变量(非静态)
必须在对象创建完成前赋值,可选方式:
定义时直接赋值:
private final int age = 20;非静态初始化块中赋值:
1
2
3
4private final int score;
{
score = 90; // 初始化块中赋值
}构造器中赋值:
1
2
3
4private final String name;
public Person(String n) {
name = n; // 构造器中赋值
}本质:所有方式最终都在构造器执行期间完成赋值(初始化块会被合并到构造器中执行)。
final 类变量(静态)
必须在类加载完成前赋值,可选方式:
定义时直接赋值:
private static final double PI = 3.14;静态初始化块中赋值:
1
2
3
4private static final long MAX_VALUE;
static {
MAX_VALUE = 10000L; // 静态初始化块中赋值
}本质:所有方式最终都在静态初始化块执行期间完成赋值。
注意点
final修饰引用类型变量时,仅保证引用地址不变,但对象内部的属性仍可修改。例如:
1
2
3final List<String> list = new ArrayList<>();
list.add("hello"); // 允许(修改对象内容)
list = new ArrayList<>(); // 报错(修改引用地址)局部变量被
final修饰时,必须在使用前赋值,赋值后不可修改
v1.3.10