细节四、final 修饰局部变量的场景fianl 局部变量由程序员进行显示的初始化,如果 final 局部变量进行初始化之后就不能再次进行更改 。
如果 final 变量未进行初始化,可以进行赋值,并且只能进行一次赋值,一旦赋值之后再次赋值就会出错 。
下面的代码演示 final 修饰局部变量的情况:
文章插图
细节五、final 修饰方法会对重载有影响吗?重写呢?对于重载:final 修饰方法后是可以重载的
如下代码:
public class FinalTest { public final void test(){ } //重载方法不会出现问题 public final void test(String test){ }}
对于重写:当父类的方法被 final 修饰的时候,子类不能重写父类的该方法文章插图
如上代码所示,可以看到会出现 cannot override ,overridden method is final 的编译错误提示
细节六、final 修饰类的场景当用final修饰一个类时,表明这个类不能被继承 。也就是说,如果一个类你永远不会让他被继承,就可以用 final 进行修饰 。
final 类中的成员变量可以根据需要设为 final,但是要注意 final 类中的所有成员方法都会被隐式地指定为 final 方法 。
细节七、写 final 域的重排序规则,你知道吗?这个规则是指禁止对 final 域的写重排序到构造函数之外,这个规则的实现主要包含了两个方面:
- JMM 禁止编译器把 final 域的写重排序 到 构造函数 之外
- 编译器会在 final 域写之后,构造函数 return 之前,插入一个 StoreStore 屏障 。这个屏障可以禁止处理器把 final 域的写重排序到构造函数之外
public class FinalTest{ private int a; //普通域 private final int b; //final域 private static FinalTest finalTest; public FinalTest() { a = 1; // 1. 写普通域 b = 2; // 2. 写final域 } public static void writer() { finalTest = new FinalTest(); } public static void reader() { FinalTest demo = finalTest; // 3.读对象引用 int a = demo.a; //4.读普通域 int b = demo.b; //5.读final域 }}
假设线程 A 在执行 writer()方法,线程 B 执行 reader()方法 。由于变量 a 和变量 b 之间没有依赖性,所以就有可能会出现下图所示的重排序
文章插图
由于普通变量 a 可能会被重排序到构造函数之外,所以线程 B 就有可能读到的是普通变量 a 初始化之前的值(零值),这样就可能出现错误 。
而 final 域变量 b,根据重排序规则,会禁止 final 修饰的变量 b 重排序到构造函数之外,从而 b 能够正确赋值,线程 B 就能够读到 final 域变量 b初始化后的值 。
结论:写 final 域的重排序规则可以确保在对象引用为任意线程可见之前,对象的 final 域已经被正确初始化过了,而普通域就不具有这个保障 。
细节八:读 final 域的重排序规则,你知道吗?这个规则是指在一个线程中,初次读对象引用和初次读该对象包含的 final 域,JMM 会禁止这两个操作的重排序 。
还是上面那段代码
public class FinalTest{ private int a; //普通域 private final int b; //final域 private static FinalTest finalTest; public FinalTest() { a = 1; // 1. 写普通域 b = 2; // 2. 写final域 } public static void writer() { finalTest = new FinalTest(); } public static void reader() { FinalTest demo = finalTest; // 3.读对象引用 int a = demo.a; //4.读普通域 int b = demo.b; //5.读final域 }}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 三只乌龟的故事 寓意?三只乌龟的故事视频
- 写给后端的Nginx初级入门教程
- Linux上TCP的几个内核参数调优
- 一次几乎不可能的数据库迁移
- 深入理解 Linux 内核中的 RCU 机制
- 最丑的外星人 外星生物长什么样子
- 三国演义中的真实事件 三国演义真实存在的事件
- 狼的知识点 狼的相关知识
- 6款Windows良心优质软件推荐,需要的自取
- 考古并不是简单的将珍贵文物挖掘出来呈现给世人 孔子看到的不一定是真实的故事