final关键字和不变性

什么是不变性(Immutable)

如果对象在创建后,状态就不被修改,那么它就是不可变得
不可变对象要求,所有属性都不能改变

具有不可变性的对象一定是线程安全的,不需要其他安全措施,也能保证线程安全。

final的作用

类防止被继承,方法防止被重写,变量防止被修改

天生是线程安全的,不需要额外的同步措施,进而也不需要过多的性能损失。

3种用法:

修饰变量:

  1. 修改变量,意味着值不能被修改。

  2. 如果变量是对象,那么变量的引用不能变,但是对象的内容可以改变。

  3. final修改3种变量:(赋值时机)
    a. 类中的final属性

    • 声明变量时等号右边直接赋值
    • 构造函数中赋值
    • 构造代码块中赋值(不常用)
    • 如果不用第一种方式,必需选择方式2,或者3赋值,final不能不赋值。

    b. 类中的static final 属性

    • 声明变量时等号右边直接赋值
    • 静态代码块中赋值。

    c. 方法中的final变量

    • 不规定赋值时机
    • 要求使用前必需赋值
    • 这和非final修饰的变量是一样的

修改方法:

不允许修饰构造方法
不可被重写

修饰类:

不可被继承
String就是final的,不能被继承

不变性和final的关系

不变性并不意味着就是final
满足一下条件,对象才是不可变

  1. 对象创建后,状态就不能修改
  2. 所有属性都是final修饰的
  3. 对象不会发生逸出,private修饰的

栈封闭——把变量写在线程内部

因为栈是线程私有的,栈中不会发生线程安全问题

final 修改的String会在常量池赋值,编译器只要能在编译器替我们做,就不会再运行时期在堆中赋值。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容