0%

final关键字

final 关键字详解

在 Java 中,final是一个重要的关键字,可用于修饰变量、方法和类,分别赋予它们不同的特性。下面详细解析其用法和特性:

final 修饰方法

核心作用

final修饰的方法不允许被子类重写,从而保证方法行为的稳定性。

特殊说明

  • 类中所有private方法默认隐式为final。因为private方法只能在当前类中访问,子类无法继承,自然无法重写。
  • 若子类中定义了与父类private方法同名的方法,这并非重写,而是子类新定义的方法,编译不会报错。

优势

  1. 行为一致性:防止子类通过重写改变核心方法的逻辑。
  2. 性能优化:
    • 编译器可对final方法进行静态绑定(无需运行时动态解析方法调用)。
    • 可能触发内联优化:用方法体代码直接替换调用处,减少方法调用的栈操作开销。

final 修饰类

核心作用

final修饰的类不允许被继承,即该类没有子类。

典型案例

Java 中的String类就是final类,保证了字符串的不可变性和安全性,避免被继承后修改其核心行为。

使用场景

当类的设计不希望被扩展,或类的逻辑不适合被修改时(如工具类、基础组件),可声明为final

final 修饰变量

final修饰的变量为常量,一旦赋值后不可修改。其初始化规则因变量类型(实例变量 / 类变量)而异。

final 实例变量(非静态)

必须在对象创建完成前赋值,可选方式:

  • 定义时直接赋值
    private final int age = 20;

  • 非静态初始化块中赋值:

    1
    2
    3
    4
    private final int score;
    {
    score = 90; // 初始化块中赋值
    }
  • 构造器中赋值:

    1
    2
    3
    4
    private final String name;
    public Person(String n) {
    name = n; // 构造器中赋值
    }

    本质:所有方式最终都在构造器执行期间完成赋值(初始化块会被合并到构造器中执行)。

final 类变量(静态)

必须在类加载完成前赋值,可选方式:

  • 定义时直接赋值
    private static final double PI = 3.14;

  • 静态初始化块中赋值:

    1
    2
    3
    4
    private static final long MAX_VALUE;
    static {
    MAX_VALUE = 10000L; // 静态初始化块中赋值
    }

    本质:所有方式最终都在静态初始化块执行期间完成赋值。

注意点

  • final修饰引用类型变量时,仅保证引用地址不变,但对象内部的属性仍可修改。例如:

    1
    2
    3
    final List<String> list = new ArrayList<>();
    list.add("hello"); // 允许(修改对象内容)
    list = new ArrayList<>(); // 报错(修改引用地址)
  • 局部变量被final修饰时,必须在使用前赋值,赋值后不可修改

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10