final关键字

什么是不变性(Immutable)

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

final的作用

  • 类防止被继承、方法防止被重写、变量防止被修改
  • 天生是线程安全的,不需要额外的同步开销

3中用法:修饰变量、方法、类

  • 变量:被final修饰的变量值不能被修改。如果变量是对象,那么对象的引用不能变化,但是对象自身的内容依然可以变化。
    • 赋值时机
      • 类中的final属性:在声明变量的等号右边直接赋值;在构造函数中赋值;在静态代码块中赋值;必须选一种赋值方式。
      • 类中的static final属性:在声明变量的等好的右边直接赋值;静态代码块中赋值;必须赋值。
      • 方法中的final变量:不规定赋值时机,只要求在使用前必须赋值。
    • 为什么要规定赋值时机:如果初始化不赋值,后续赋值,就是从null变成你赋的值,这就违反final不变的原则了
  • 方法
    • 构造方法不允许final修饰
    • 不可被重写,也就是不能被override,即便是子类有同样名字的方法,那也不是override,这个和static方法是一个道理。
    • 不能被继承:如String类。

注意点

  • final修饰对象的时候,只是对象的引用不可变,而对象本身的属性是可以变化的
  • final使用原则:良好的编程习惯,如果知道该变量一旦赋值就不会发生变化,那就在定义的时候就定义为final变量。

不变性和final的关系

  • 不变性并不意味着简单地用final修饰就是不可变
    • 对于基本数据类型,确实被final修饰后就具有不变性
    • 但是对于对象类型,需要该对象保证自身被创建后,状态永远不会变才可以。
  • 如何实现对象类型不可变
    • 第一种
      • 对象创建后,其状态就不能修改
      • 所有属性都是final修饰的
      • 对象创建过程中没有发生溢出
    • 第二种
      • 把变量写在线程内部——栈封闭
        • 在方法里新建局部变量,实际上是存储在每个线程的私有的栈空间,而每个栈空间是不能被其他线程所访问到的,所以不会有线程安全问题。这就是著名的“栈封闭”技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值