[TOC] ### Java 的 `final` 关键字原理 `final` 关键字在 Java 中主要用于确保对象的不可变性、方法的不可重写性以及类的不可继承性。它通过限制某些方面的修改来增强代码的稳定性和安全性。下面是 `final` 关键字的详细原理及其与其他相关关键字的关系: [gitee链接](https://gitee.com/MyCoder4j/wechat) #### 1. `final` 变量 - **不可变性**:`final` 修饰的变量一旦初始化后,其值就不能再被改变。 - **初始化时机**: - 对于实例变量,必须在构造器结束前初始化。 - 对于类变量(静态变量),必须在静态初始化块中或声明时初始化。 - 对于局部变量,可以在声明时或首次使用前初始化。 **示例**: ```java public class FinalVariableExample { final int x = 10; // 实例变量 static final int y = 20; // 静态变量 public FinalVariableExample() { // x = 15; // 错误:已经初始化,不能再赋值 } public static void main(String[] args) { final int z = 30; // 局部变量 // z = 40; // 错误:已经初始化,不能再赋值 } } ``` #### 2. `final` 方法 - **不可重写性**:`final` 修饰的方法不能被子类重写。 - **用途**:防止子类改变父类的关键行为,确保某些方法的行为在整个继承层次中保持一致。 **示例**: ```java class Parent { final void show() { System.out.println("This is a final method."); } } class Child extends Parent { // 下面的尝试将会导致编译错误 // @Override // void show() { // System.out.println("Trying to override a final method."); // } } ``` #### 3. `final` 类 - **不可继承性**:`final` 修饰的类不能被继承。 - **用途**:防止类被子类化,确保类的不可变性和安全性,常用于工具类和不可变类(如 `String`)。 **示例**: ```java final class UtilityClass { static void doSomething() { System.out.println("Performing an action..."); } } // 下面的尝试将会导致编译错误 // class AnotherClass extends UtilityClass { // } ``` ### 与 `final` 相关的关键字 #### 1. `static` - **静态成员**:`static` 修饰的变量和方法属于类而不是类的实例。 - **初始化**:静态变量在类加载时初始化,静态方法可以通过类名直接调用。 - **与 `final` 结合**:`static final` 组合常用于定义常量。 **示例**: ```java class Constants { static final int MAX_VALUE = 100; static void printMaxValue() { System.out.println("Max Value: " + MAX_VALUE); } } public class Main { public static void main(String[] args) { Constants.printMaxValue(); // 通过类名调用静态方法 } } ``` #### 2. `abstract` - **抽象类和方法**:`abstract` 修饰的类不能被实例化,`abstract` 修饰的方法没有实现,必须在子类中实现。 - **与 `final` 结合**:`final` 和 `abstract` 不能同时修饰同一个类或方法,因为 `final` 表示不可继承或重写,而 `abstract` 要求必须被继承或重写。 **示例**: ```java abstract class Animal { abstract void makeSound(); } class Dog extends Animal { @Override void makeSound() { System.out.println("Bark"); } } // 下面的尝试将会导致编译错误 // final abstract class MyClass { // } ``` ### 总结 - **`final` 变量**:确保变量的值不可改变。 - **`final` 方法**:确保方法的行为不可被子类改变。 - **`final` 类**:确保类不可被继承。 - **`static`**:用于定义类级别的成员。 - **`abstract`**:用于定义抽象类和方法,要求子类实现。 通过合理使用这些关键字,可以增强代码的稳定性和安全性,提高程序的可维护性和可读性。