Java 语言 final
关键字
final
是 Java 语言的关键字之一,final
关键字可用于多个场景,在不同场景下具有不同的作用。
图:
final
关键字几个使用场景
final
修饰变量:被修饰变量必须先被初始化(赋值),初始化后不能修改值(常量)。final
修饰方法:被修饰方法无法被其子类重写或覆写。final
修饰类:被修饰类无法被继承,类中所有成员方法会被隐式指定为final
方法,成员变量不变。
final
修饰变量
当使用final
关键字修饰类成员变量或局部变量后,变量值就不能被再次修改,如果final
修饰引用变量,则表示该变量无法重新绑定到新的对象,但是可以更改该引用变量指向对象的内部状态。 final
与static
配合使用,可以创建类常量。
final
变量必须被初始化,否则编译器将抛出编译时错误,且只能被初始化一次。
C++ 中const
变量与 Java 中final
变量的异同:C++ 中的const
变量必须在声明时赋值,而 Java 中的final
变量可以先声明,稍后赋值,但只能赋值一次,两者赋值后都不能再修改变量值。
final
修饰方法
使用final
方法的原因有两个:一是将方法锁定,防止继承类修改;二是运行效率。
当使用final
关键字修饰方法时,该方法被称为final
方法。final
方法无法被覆盖(重写),如果你不希望继承类修改某方法的实现时,可声明此方法为final
方法。类中的私有方法(private)隐式为final
方法,无需添加关键字。final
与abstract
关键字永远不会在类或方法中同时出现。
关于高效,JVM 早期实现中,如果将一个方法声明为final
,即同意编译器将针对该方法的调用都转化为内联调用。而现代 JVM 设计实现(HotSpot)中,可以根据具体情况自动优化选择是否进行函数内联,这取决于编译器的编译优化策略。
final
修饰类
当使用final
关键字修饰一个类时,该类被称为final
类。final
类无法被继承,对象创建后也不可变(即:不可变类)。
Java 语言中所有的包装类都是final
类,字符串String
类也是final
类。
final
优化编码
使用final
关键字在效率上的作用可以总结为以下三点:
缓存:
final
配合static
关键字形成常量,提高代码性能。同步:
final
变量或对象是只读的,可以安全的在多线程环境下进行共享,不需要额外的同步开销。内联:JVM 可显式对
final
关键字修饰的变量、方法及类进行内联优化。