【java】final关键字

文章详细介绍了Java中的final关键字,包括final修饰类防止继承,修饰方法阻止重写,以及修饰变量确保不可变。同时,解释了常量的概念,如字面值常量和自定义常量(final修饰的变量)。文章还深入到内存层面,讨论了final变量的设置原理,涉及写屏障确保线程安全,并指出获取final变量时的优化策略,如小数据放入栈,大数据放入常量池。
摘要由CSDN通过智能技术生成
一、final关键字
  • 1.final修饰类,类不能被继承
  • 2.final修饰方法,不能被子类重写
  • 3.final修饰变量(成员变量、静态变量和局部变量),只能被赋值一次
  • 4.final修饰的变量,变量的属性值是可以重新赋值的
  • 5.final修饰的变量被赋值一次后就成了常量
二、常量
  • 1.字面值常量,能够直接写出来的数据,例如100,3.14,‘a’,true,“abcd”,null(null不能被直接打印)
  • 2.自定义常量,被final修饰的变量,被赋值一次就变成了常量,例如final int a = 20; final Student student = new Student(); 但student.age = 22;还是可以修改的,因为student指向的是student的内存地址,被final修饰后是不能变的,但age属性的地址没有被final修饰,所以是可变的
三、设置final变量的原理
3.1 代码示例
public class FinalLearning{
	final int a = 20;
}
3.2 字节码
 0 aload_0
 1 invokespecial #1 <java/lang/Object.<init> : ()V>
 4 aload_0
 5 bipush 20
 7 putfield #2 <com/FinalLearning.a : I>
<---写屏障
10 return
3.3 说明
  • 1.int a = 20;是两个操作,首先给变量分配空间,初始值为0,然后才会赋值为20,如果其它线程在赋值20之前读到a为0,则变量的使用是不正确的
  • 2.final会加写屏障
  • 3.写屏障能让之前的指令不会被重排序到写屏障后面,写屏障之前的所有赋值操作在写屏障之后会被同步到主存,对其它线程可见
四、获取final变量的原理
  • 1.类A使用类B的final属性时,较小的数据会复制到类A方法的方法栈,如果数值较大,会放入常量池中,不加final会从堆中访问,效率最低
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王佑辉

老板,赏点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值