深入理解 Java final 关键字:变量、方法与类的不可变性
Java final 关键字
探索 Java final 关键字如何保护常量、禁止方法重写、阻止类继承,附带清晰示例。
在 Java 中,final 关键字表示实体(变量、方法或类)在初始定义后不可更改。这种不可变契约在编译期强制执行,为开发者提供程序行为的保证。
- Final 变量不可重新赋值。
- Final 方法不能在子类中被重写。
- Final 类不能被继承。
1. Final 变量
声明变量为 final 后,其值在首次赋值后被锁定。这是 Java 中定义常量的标准方式。
class Main { public static void main(String[] args) { // 声明 final 变量 final int AGE = 32; // 以下行会导致编译错误 // AGE = 45; System.out.println("Age: " + AGE); } }
编译器会拒绝编译试图重新赋值 AGE 的代码,报错类似:
cannot assign a value to final variable AGE AGE = 45; ^
提示: 惯例上,常量名全大写并用下划线分隔(如 MAX_SIZE),以表明其不可变性。
2. Final 方法
Final 方法是 Java 继承安全网的一部分。方法标记为 final 后,任何子类都无法重写它,从而保留原始实现。
class FinalDemo { // Final 方法 public final void display() { System.out.println("This is a final method."); } } class Main extends FinalDemo { // 尝试重写 —— 编译错误 public final void display() { System.out.println("The final method is overridden."); } public static void main(String[] args) { Main obj = new Main(); obj.display(); } }
尝试重写 display() 会产生错误:
display() in Main cannot override display() in FinalDemo public final void display() { ^ overridden method is final
3. Final 类
final 类不可被子类化。常用于安全关键或不可变类型,确保类行为不被篡改。
// Final 类定义 final class FinalClass { public void display() { System.out.println("This is a final class."); } } // 尝试继承 final 类 class Main extends FinalClass { public void display() { System.out.println("The final class is overridden."); } public static void main(String[] args) { Main obj = new Main(); obj.display(); } }
编译器会拒绝此继承:
cannot inherit from final FinalClass class Main extends FinalClass { ^
java
- C# static 关键字:静态变量、方法与类完全掌握
- Java instanceof 运算符完全指南:用法、继承与接口检查
- 精通 Java 继承:核心概念、类型与实战示例
- 深入理解 Java 静态嵌套类:用法、差异与实战示例
- 精通 Java 匿名内部类:定义、语法与实战示例
- Java 单例模式详解:安全实现与使用指南
- 精通 Java 反射:运行时检查类、方法与字段
- 精通 Java ArrayList:操作、方法与最佳实践
- Java Stack 类全面指南:用法、核心方法与实战示例
- 掌握 Java ObjectOutputStream:序列化、核心方法与实战示例
- 掌握 Java 泛型:构建可复用、类型安全的代码
- 掌握 Java 文件操作:java.io 包下的创建、读取、写入与删除