final 具体使用场景
final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如 String 类就是一个final
类型的类。下面就分别以锁修饰的位置:变量、方法和类分别来说一说。
2.1 变量
2.1.1 成员变量
成员变量分为
- 类变量(
static
修饰的变量)- 声明变量时赋值
- 静态代码块中赋值
- 实例变量
- 声明变量时赋值
- 非静态初始化块中赋值
- 构造器中赋值
2.1.2 局部变量
- final 局部变量需要显式初始化
- 如果 final 局部变量已经进行了初始化,后边就不能再改
- 如果 final 局部变量未进行初始化,有且仅有一次赋值,后边也不能再改
注意:当**final**
修饰基本数据类型变量时,不能对基本数据类型变量重新赋值,因此基本数据类型变量不能被改变。而对于引用类型变量而言,它仅仅保存的是一个引用,**final**
只保证这个引用类型变量所引用的地址不会发生改变,即一直引用这个对象,但这个对象属性是可以改变的。
2.2 方法
- 当父类方法被
final
修饰时,子类不能重写父类的方法。比如再 Object 中,getClass
就是final
的,就不能重写。 final
方法是可以被重载的。
public class FinalExampleParent {
public final void test() {
}
public final void test(String str) {
}
}
2.3 类
- 当一个类被
**final**
修饰时,表明该类是不能被子类继承的。- 原因:子类继承往往可以重写父类的方法和改变父类属性,会带来一定的安全隐患,因此,当一个类不希望被继承时就可以使用
final
修饰。
- 原因:子类继承往往可以重写父类的方法和改变父类属性,会带来一定的安全隐患,因此,当一个类不希望被继承时就可以使用