final 有哪些用法?

final 有哪些用法?

final 是很多面试官喜欢问的问题,但这个问题其实很无聊,通常能回答以下5点就很不错了:

  • 被 final 修饰的类不可以被继承;
  • 被 final 修饰的方法不可以被重写;
  • 被 final 修饰的变量不可以被改变,如果是修饰引用,那么表示引用不可变,引用指向的内容可变
  • 被 final 修饰的方法,JVM 会尝试将其内联,以提高运行效率;
  • 被 final 修饰的常量,再编译阶段会存入常量池中。

除此之外,编译器对 final 域要遵守的两个重排序规则做了如下规定:

  1. 在构造函数内对一个 final 域的写入,与随后把这个构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序;
  2. 初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序。

如果你对上述的重排序规则不了解,那么建议你去读以下《Java并发编程的艺术》,这本书对 final 关键字的重排序规则描述的很详细,后面我也会单独写一篇文章来介绍 final 的重排序规则。


此外,如果你还能回答出下面两点,那说明你的 Java 基础是比较牢固的:

  1. final 修饰成员变量,该成员变量必须在创建对象之前进行赋值,否则编译失败。因为被 final 修饰的值是不可变的,而如果没有在对象被创建之前赋初始值,那么这个成员变量的的值将一直是系统默认分配的 0、‘\u0000’、false 或者 null,这样没有意义,因此 Java 从语法层面就规定 final 修饰的成员变量必须指定初始值
  2. 成员变量的赋值有三种实现方式:
    a. 定义成员变量的时候手动赋值
    b. 利用构造器对成员变量进行赋值

如果你对Java的对象实例化过程不了解,那么你可以参考我下面的流程图:

对象实例化过程

这是完整的流程图,更详细的描述可以看我语雀笔记:Java 对象实例化过程
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Your_Boy_Tt/article/details/130122466