十六、final关键字

16.1 final 变量

被 final 修饰的变量无法重新赋值。换句话说,final 变量一旦初始化就无法更改:
JavaSE基础之(十六)final关键字-小白菜博客
被 final 修饰的对象无法重新赋值,但是仍然可以修改对象的属性:
JavaSE基础之(十六)final关键字-小白菜博客
final 修饰的成员变量必须有一个默认值,否则编译器将会提醒没有初始化:
在这里插入图片描述

final 和 static 一起修饰的成员变量叫做常量,常量名必须全部大写:

package com.qhj.test;

/**
 * @author QHJ
 * @date 2022/9/19  17:43
 * @description: final测试类
 */
public class FinalTest {
    private final int age = 22;

    public static final double PRICE = 23.4;
}

有时候还会用 final 关键字来修饰参数,它意味着参数在方法体内不能被再修改,如果尝试去修改它的话,编译器会提示错误:
在这里插入图片描述

16.2 final 方法

被 final 修饰的方法不能被重写。在设计一个类的时候,如果认为某些方法不应该被重写,就应该把它设计成 final 的。

思考一下:一个类是 final 的;另一个类不是 final 的,但是它所有的方法都是 final 的。它们直接有什么区别?

类是 final 的,说明此类不能被继承,也就是说方法无法被重写。
后者则可以被继承,然后追加一些非 final 的方法。

16.3 final 类

如果一个类使用了 final 关键字修饰,那么它就无法被继承。任何尝试从 final 类继承的行为将会引发编译错误:

/**
 * @author QHJ
 * @date 2022/9/19  18:18
 * @description: final 修饰的类
 */
public final class Writer {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

JavaSE基础之(十六)final关键字-小白菜博客
但是,类是 final 的,并不意味着该类的对象是不可变的,也就是说,如果一个类只是 final 的,那么它并不是不可变的全部条件:

public static void main(String[] args) {
    Writer writer = new Writer();
    writer.setName("青花椒");
    System.out.println(writer.getName());
}

把一个类设计成 final 的,有其安全方面的考虑,但不应该故意为之,因为把一个类定义成 final 的,意味着它没办法继承,假如这个类的一些方法存在一些问题的话,我们就无法通过重写的方式去修复它。

16.3 总结

final关键字用于修饰不可改变的内容。

final: 不可改变。可以用于修饰类、方法和变量。

  • 类:被修饰的类,不能被继承。
  • 方法:被修饰的方法,不能被重写。
  • 变量:被修饰的变量,不能被重新赋值。