🧠 作用
final 关键字用于修饰不可被改变的变量/方法、类,表示最终态,禁止进一步的修改或继承。
📚 修饰方式
💡 修饰类
被 final 修饰的类无法被继承,整个类都是最终版本。
1
2
3
4
5
6
| public final class ImmutableClass {
// 不能有子类
}
// 编译错误:Cannot extend final class
// class SubClass extends ImmutableClass { }
|
🔧 修饰方法
被 final 修饰的方法不能被继承类重写,保证方法的实现固定不变。
1
2
3
4
5
6
7
8
9
10
| public class Parent {
public final void criticalMethod() {
System.out.println("This method cannot be overridden");
}
}
public class Child extends Parent {
// 编译错误:Cannot override final method
// public void criticalMethod() { }
}
|
📌 修饰变量
表明这个变量是常量,只能被赋值一次,赋值后不能改变。
1
2
3
4
5
6
7
8
9
| public class FinalVariableExample {
// 常量:必须在声明时或构造方法中赋值
private final String name;
public FinalVariableExample(String name) {
this.name = name; // 赋值一次
// this.name = "other"; // 编译错误:不能重新赋值
}
}
|
⚙️ 修饰基本数据类型 vs 引用数据类型
🔹 基本数据类型
修饰基本数据类型则变量存储的数值不变。
1
2
| final int num = 10;
num = 20; // 编译错误:不能改变值
|
🔹 引用数据类型
修饰引用数据类型则变量存储的地址值不变,但是对象的属性可以改变。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| public class Box {
private int value;
public Box(int value) {
this.value = value;
}
public void setValue(int value) {
this.value = value;
}
}
public class FinalReferenceExample {
public static void main(String[] args) {
final Box box = new Box(10);
// ❌ 编译错误:不能改变引用指向
// box = new Box(20);
// ✅ 可以改变对象的属性
box.setValue(20);
}
}
|
✅ 最佳实践
- 使用 final 修饰不可变对象 - 提高线程安全性
- 类设计时明确继承意图 - 如不需要被继承,使用 final
- 性能优化 - JVM 可以对 final 方法进行内联优化