1.大纲
不变性
final的作用
3种变量
注意点
不变性与final的关系
一:不变性
1.说明
如果某个对象被创建,状态就不能被修改,那么它就是不可变的
具有不可变性的对象一定是线程安全的,不需要安全措施,也能保证线程安全
二:final的作用
1.功能
类上可以防止被继承
方法可以防止被重写
变量防止被修改
可以不需要额外的同步开销【当前的jvm已经很智能优化了】
所以,这里更多的是在语义上说明,希望修饰的不可被改变,良好的变成习惯
2.fiannl修饰的变量
意味着值不能被修改。
但是,如果变量时对象,那么对象的引用不能变,对象自身的内容是可以变化的
3.三种变量
类中的:
必须初始化变量
赋值时机:在等号右边,构造函数,初始化代码块
类中static:
必须初始化变量
赋值时机:等号右边,静态初始化代码块【要加上static】
方法中的:
赋值时机:要求使用前要赋值
4.为啥要先赋值
因为初始化不赋值,后续赋值,就从null变成了新的赋值,违反了final不变的原则了
5.修饰方法
不能修饰构造方法
不可被重写,就是不能被override,编译器不会给展示出来
6.修饰类
不可以被继承
典型的String类就是final的
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -6849794470754667710L;
三:不变性与final的关系
1.说明
不变性不是意味着,简单的用final修饰就是不可变
对于基本类型,被final修饰了,就的确有了不变性
2.如何实现对象的不可变
是否里面的属性都final就可以不可变了?
是不对的,因为里面的属性可能还是对象,对象就可以变化
只要对象没有机会被修改,就是不可变的
3.总结
对象创建后,状态不能修改
所有的属性都是final的
对象创建过没有发生逸出
4.栈封闭技术
在方法里新建的局部变量,实际上市存在每个线程私有的栈空间,每个栈空间都是不能被其他的线程所访问的,不会有线程问题