十六、final关键字
16.1 final 变量
被 final 修饰的变量无法重新赋值。换句话说,final 变量一旦初始化就无法更改:
被 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;
}
}
但是,类是 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: 不可改变。可以用于修饰类、方法和变量。
- 类:被修饰的类,不能被继承。
- 方法:被修饰的方法,不能被重写。
- 变量:被修饰的变量,不能被重新赋值。