final关键字与不变性

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.栈封闭技术

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

  

  

  

原文地址:https://www.cnblogs.com/juncaoit/p/13082192.html