Java 中的 final 关键字有哪些用法?

推荐答案

Java 中的 final 关键字有哪些用法?

总结性回答

Java 中的 final 关键字主要有三种用法:

  1. 修饰变量:表示该变量一旦初始化后就不能被修改
  2. 修饰方法:表示该方法不能被子类重写(override)
  3. 修饰类:表示该类不能被继承

详细解释

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 的,比如 StringInteger 等包装类。

其他注意事项

  1. final 变量必须在声明时或在构造函数中初始化
  2. static final 组合用于定义类常量
  3. final 可以提高性能,JVM 会对 final 变量进行优化
  4. final 有助于实现线程安全,因为不可变对象天生是线程安全的