final类
(1)修饰的类不可被继承
不变类的意思是创建该类的实例后,该实例的实例变量是不可改变的。满足以下条件则可以成为不可变类:
使用private和final修饰符来修饰该类的成员变量
提供带参的构造器用于初始化类的成员变量;
仅为该类的成员变量提供getter方法,不提供setter方法,因为普通方法无法修改fina修饰的成员变量;
如果有必要就重写Object类 的hashCode()和equals()方法,应该保证用equals()判断相同的两个对象其Hashcode值也是相等的。
final方法
(2)修饰的方法不可被重写
(3)申请为jvm内联方法,提高执行效率
final变量
(4)修饰的变量不可以被改变
(5)修饰的常量会在编译时进入常量池
会成为常量
- 使用final修饰符修饰;
- 在定义该final变量时就指定了初始值;
- 该初始值在编译时就能够唯一指定。
注意:当程序中其他地方使用该变量的地方,编译器会直接替换成该变量的值
(6)final域重排序规则
写final域重排序规则,禁止final域写与构造方法重排序
读final域重排序规则,禁止初次读对象的引用与读该对象包含的final域的重排序(有一些处理器会重排序)
引用数据类型
额外增加约束:禁止在构造函数对一个final修饰的对象的成员域的写入与随后将这个被构造的对象的引用赋值给引用变量重排序
PS.
final类中的所有方法都默认为final
类内所有的private方法都自动成为final
final方法是可以被重载的
参考引用:
https://www.cnblogs.com/xiaoxi/p/6392154.html
final域重排序的问题及其规则
https://blog.csdn.net/u011521203/article/details/80172121
https://www.cnblogs.com/xiaoxiaoyihan/p/4974273.html#autoid-1-1-0