Java 中的 final 关键字有哪些用法?
Java 中的 final 关键字有哪些用法?
总结性回答
Java 中的 final
关键字主要有三种用法:
- 修饰变量:表示该变量一旦初始化后就不能被修改
- 修饰方法:表示该方法不能被子类重写(override)
- 修饰类:表示该类不能被继承
详细解释
1. final 修饰变量
当 final
修饰变量时,表示该变量是一个常量,一旦被赋值后就不能再改变。根据变量的类型不同,有以下几种情况:
-
基本类型变量:值不能被修改
final int MAX_VALUE = 100; // MAX_VALUE = 200; // 编译错误,不能修改final变量
-
引用类型变量:引用不能改变,但对象内部状态可以改变
final List<String> list = new ArrayList<>(); list.add("Hello"); // 允许 // list = new ArrayList<>(); // 编译错误,不能修改引用
-
方法参数:参数在方法内不能被重新赋值
void process(final int param) {// param = 10; // 编译错误 }
2. final 修饰方法
final
方法不能被子类重写,主要用于防止子类修改方法的行为:
class Parent {public final void show() {System.out.println("Parent show");}
}class Child extends Parent {// @Override// public void show() { // 编译错误,不能重写final方法// System.out.println("Child show");// }
}
3. final 修饰类
final
类不能被继承,常用于设计不可变的类或出于安全考虑:
final class ImmutableClass {private final int value;public ImmutableClass(int value) {this.value = value;}public int getValue() {return value;}
}// class SubClass extends ImmutableClass { // 编译错误,不能继承final类
// }
Java 中很多基础类都是 final
的,比如 String
、Integer
等包装类。
其他注意事项
final
变量必须在声明时或在构造函数中初始化static final
组合用于定义类常量final
可以提高性能,JVM 会对final
变量进行优化final
有助于实现线程安全,因为不可变对象天生是线程安全的