一、什么是不变性
如果对象在被创建后,状态就不能被修改,那么它就是不可变的。
具有不变性的对象一定是线程安全的,我们不需要对其采取任何额外的安全措施,也能保证线程安全。
二、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"。