在Java中,final
关键字用于表示不可变性,具体作用取决于它修饰的目标(变量、方法或类)。以下是其核心作用:
1. 修饰变量(常量)
-
基本类型变量:值不可更改(常量)。
final int MAX_VALUE = 100; // MAX_VALUE = 200; // 编译错误,不能重新赋值
-
引用类型变量:引用地址不可更改(但对象内部状态可能可变)。
final List<String> list = new ArrayList<>(); list.add("Hello"); // 允许修改对象内容 // list = new ArrayList<>(); // 编译错误,不能重新赋值引用
-
注意:必须在声明时或构造方法/代码块中初始化。
2. 修饰方法
-
禁止子类重写:父类中的
final
方法不能被子类覆盖。class Parent {final void show() { System.out.println("不可重写"); } } class Child extends Parent {// void show() { } // 编译错误,不能重写final方法 }
3. 修饰类
-
禁止继承:
final
类不能被其他类继承(如String
、Integer
等)。final class ImmutableClass { } // class SubClass extends ImmutableClass { } // 编译错误
4. 其他场景
-
方法参数:参数在方法内不能被重新赋值(仅限引用地址)。
void process(final int x) {// x = 10; // 编译错误 }
-
线程安全:
final
变量的初始化保证对其他线程可见(无需同步)。
关键区别总结
修饰目标 | 作用 |
---|---|
变量 | 值/引用不可变 |
方法 | 不可重写 |
类 | 不可继承 |
设计意义
-
清晰性:明确标识不可变的设计意图。
-
安全性:防止意外修改(如常量、核心类库)。
-
性能优化:JVM可能对
final
进行优化(如内联)。
通过合理使用 final
,可以提升代码的健壮性和可维护性。