Java 基础教程系列 - final 关键字详解

Java Tutorial for Language Basics - final Keyword Explanation

Posted by zihengCat on 2019-04-18

Java 语言 final 关键字

final是 Java 语言的关键字之一,final关键字可用于多个场景,在不同场景下具有不同的作用。

final

图:final关键字几个使用场景

  • final修饰变量:被修饰变量必须先被初始化(赋值),初始化后不能修改值(常量)。

  • final修饰方法:被修饰方法无法被其子类重写或覆写。

  • final修饰:被修饰类无法被继承,类中所有成员方法会被隐式指定为final方法,成员变量不变。

final 修饰变量

当使用final关键字修饰类成员变量或局部变量后,变量值就不能被再次修改,如果final修饰引用变量,则表示该变量无法重新绑定到新的对象,但是可以更改该引用变量指向对象的内部状态。 finalstatic配合使用,可以创建类常量

final变量必须被初始化,否则编译器将抛出编译时错误,且只能被初始化一次。

C++ 中const变量与 Java 中final变量的异同:C++ 中的const变量必须在声明时赋值,而 Java 中的final变量可以先声明,稍后赋值,但只能赋值一次,两者赋值后都不能再修改变量值。

final 修饰方法

使用final方法的原因有两个:一是将方法锁定,防止继承类修改;二是运行效率。

当使用final关键字修饰方法时,该方法被称为final方法。final方法无法被覆盖(重写),如果你不希望继承类修改某方法的实现时,可声明此方法为final方法。类中的私有方法(private)隐式为final方法,无需添加关键字。finalabstract关键字永远不会在类或方法中同时出现。

关于高效,JVM 早期实现中,如果将一个方法声明为final,即同意编译器将针对该方法的调用都转化为内联调用。而现代 JVM 设计实现(HotSpot)中,可以根据具体情况自动优化选择是否进行函数内联,这取决于编译器的编译优化策略。

final 修饰类

当使用final关键字修饰一个类时,该类被称为final类。final类无法被继承,对象创建后也不可变(即:不可变类)。

Java 语言中所有的包装类都是final类,字符串String类也是final类。

final 优化编码

使用final关键字在效率上的作用可以总结为以下三点:

  • 缓存:final配合static关键字形成常量,提高代码性能。

  • 同步:final变量或对象是只读的,可以安全的在多线程环境下进行共享,不需要额外的同步开销。

  • 内联:JVM 可显式对final关键字修饰的变量、方法及类进行内联优化。