在 Java 中,final 是一个关键字,可以修饰类、方法、变量(包括局部变量、成员变量、静态变量),不同修饰场景下含义不同,核心是体现 "不可变" 或 "不可继承 / 重写" 的特性。
1. 修饰类
-
含义 :被
final修饰的类不能被继承,即无法派生子类。 -
用途 :通常用于设计不可变的类(如
String、Integer等包装类),保证类的安全性和稳定性。 -
示例 :
final class FinalClass { // 该类无法被继承 } // 错误!无法继承final类 // class SubClass extends FinalClass {}
2. 修饰方法
-
含义 :被
final修饰的方法不能被子类重写(override),但可以被重载(overload)。 -
用途:防止子类修改父类方法的逻辑,保证方法行为的一致性。
-
示例 :
class Parent { public final void finalMethod() { System.out.println("父类final方法"); } } class Child extends Parent { // 错误!无法重写final方法 // @Override // public void finalMethod() {} // 允许重载 public void finalMethod(int a) { System.out.println("重载final方法"); } }
3. 修饰变量
final修饰变量时,变量成为常量 ,需遵循 "声明时初始化" 或 "构造器 / 代码块中初始化" 的规则,且初始化后值不可修改。
(1)修饰局部变量
-
局部变量被
final修饰后,必须在使用前初始化,且值不可变。 -
示例:
public void testLocalFinal() { final int a; // 声明 a = 10; // 初始化(只能赋值一次) // a = 20; // 错误!final变量不可重新赋值 final int b = 20; // 声明时直接初始化 }
(2)修饰成员变量(实例变量)
-
成员变量被
final修饰后,必须在声明时、实例初始化块中或构造器中初始化(三者选其一),且每个实例的该变量值固定。 -
示例:
class FinalVarDemo { // 方式1:声明时初始化 final int num1 = 10; // 方式2:实例初始化块中初始化 final int num2; { num2 = 20; } // 方式3:构造器中初始化 final int num3; public FinalVarDemo() { num3 = 30; } }
(3)修饰静态变量(类变量)
-
静态变量被
final修饰后,必须在声明时或静态初始化块中初始化(不能在构造器中),且属于类的常量,全局唯一。 -
通常命名规范为全大写,单词间用下划线分隔(如
PI)。 -
示例:
class FinalStaticDemo { // 方式1:声明时初始化 public static final double PI = 3.1415926; // 方式2:静态初始化块中初始化 public static final int MAX_SIZE; static { MAX_SIZE = 100; } }
4. 修饰引用类型变量
-
final修饰引用类型变量时,引用本身不可变(即不能指向新的对象),但对象的内容可以修改。 -
示例:
final List<String> list = new ArrayList<>(); list.add("Java"); // 允许修改对象内容 // list = new LinkedList<>(); // 错误!引用不可指向新对象
总结
| 修饰目标 | 特性 |
|---|---|
| 类 | 不可继承 |
| 方法 | 不可重写(可重载) |
| 变量 | 不可重新赋值(引用类型变量的对象内容可修改) |
final关键字的核心作用是保证不可变性,常用于定义常量、防止类 / 方法被篡改,提升代码的安全性和可读性。