final关键字的作用

深入学习Java基础知识
2021-05-17 14:29 · 阅读时长4分钟
小课

在Java中final关键字可以修饰类、方法和变量,包括局部变量、成员变量、参数,不同的使用场景有不同的作用。

一、final类

当使用final来修饰类时,表明这个类是不能够被继承,比如说java.lang.String这个类,如果类不可被继承,它就没有了扩展性,一般出于安全考虑我们才会用final来修饰类,这样第三方使用者就无法通过继承这个类来修改类的内部逻辑或者数据。

二、final方法

当使用final来修饰方法时,表明这个方法不能被子类重写,有些时候某个类的只有一部分方法需要保证不被修改,这种情况我们应该用final来修饰方法而不是类,因为这样能够尽量保证可扩展性,比如java.lang.Thread这个类,它的isAlive()setPriority()等方法就是final修饰的,这样既保证了安全性又可扩展。

三、final变量

当使用final修饰变量时,这个变量在初始化之后就不能再重新赋值,但是变量的属性不受影响,比如

class Course {
    String name;
    Course(String name) {
        this.name = name;
    }
}
final Course course = new Course("Java programming");
course = new Course("Python programming"); // 编译错误
course.name = "Python programming"; // 修改成功

当使用final修饰变量时需要注意以下几点

  • 修饰局部变量时,需要在使用之前初始化。
  • 修饰实例成员变量时,需要在构造方法完成之前初始化变量,比如在定义时初始化,构造代码块中初始化或者构造方法中初始化。
  • 修饰静态成员变量时,需要在定义时或者静态代码块中初始化。

关于使用反射来修改final变量的实际结果如下

加载中...

注释

之所以name修改没成功是因为在定义时已经为它赋值,而且是final修饰,即不可变,编译器在编译时已经将所有使用course.name的地方替换成了"Java programming"。

finaljava