final关键字和不变性

一、什么是不变性

如果对象在被创建后,状态就不能被修改,那么它就是不可变的。

具有不变性的对象一定是线程安全的,我们不需要对其采取任何额外的安全措施,也能保证线程安全。

二、final

1.修饰方法

  • 修饰方法表示这个方法不可以被重写
  • 不能修饰构造方法

引申:static修饰的也不能重写

2.修饰类

  • 表示不可被继承

String就是final的

3.修饰对象

  • 表示对象的引用不可变,而对象本身的属性可以变化。

三、不变性和final的关系

  • 对于基本数据类型,一旦被final修饰就不可变;
  • 但是对于对象而言,需要对象本身被创建后是不可变的。

如何利用final实现对象不可变?

  • 所有属性声明为final?但如果有个属性是对象,那还可能是可变的。
  • 如果一个对象属性均为私有,且没有set等修改属性的方法,那这个对象就是不可变的。

四、栈封闭

方法里新建的的局部变量,实际上是存储在每个线程私有的栈空间,而每个栈的栈空间是不能被其他线程所访问到的,所以不会有线程安全问题。

五、面试题

在这里插入图片描述
最终输出的结果为 true false。

加上final后会将b当作一个常量(在运行之前就能知道b的值),那么c经过计算得知c的值为"wukong2"。因为字符串常量池中已经有一个"wukong2",就会直接指向a指向的"wukong2",所以a、c指向同一个

而d不是一个常量,在运行时才能知道它的值,所以e会指向堆中新建的一个"wukong2"。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值