在Java中final关键字可以修饰类、方法和变量,包括局部变量、成员变量、参数,不同的使用场景有不同的作用。
当使用final来修饰类时,表明这个类是不能够被继承,比如说java.lang.String
这个类,如果类不可被继承,它就没有了扩展性,一般出于安全考虑我们才会用final来修饰类,这样第三方使用者就无法通过继承这个类来修改类的内部逻辑或者数据。
当使用final来修饰方法时,表明这个方法不能被子类重写,有些时候某个类的只有一部分方法需要保证不被修改,这种情况我们应该用final来修饰方法而不是类,因为这样能够尽量保证可扩展性,比如java.lang.Thread
这个类,它的isAlive()
,setPriority()
等方法就是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"。