1、不变性
如果一个对象被创建之后状态就不能被修改就具有不变性,具有不变性的对象一定是线程安全的。
2、final修饰变量
属性被声明为final后只能被赋值一次,一旦被赋值就不能修改
(1)final修饰的是是基本类型的数据,就表示这个数据不能变
(2)final修饰的是对象引用,该引用的指向不能变(不能指向其他对象),但指向的对象的属性(内容)是可以变的
(3)final修饰的变量是类的一般属性时赋值的时机:变量声明时等号右边,构造函数中,
初始化代码块中
(4)final修饰的变量是类的static属性时赋值的时机:变量声明时等号右边,静态代码块中,不能在构造函数中
(5)final修饰的变量是方法中的临时变量赋值的时机:在使用前赋值即可
3、final修饰方法
(1)不能修饰构造方法
(2)修饰的方法不能被重写
4、final修饰类
修饰的类不能被继承,如String类
5、实例:
代码:
运行结果:
分析:
(1)在类的加载过程中:运行第6行时会在方法区的常量池中创建字面量“wukong”,同时在堆中创建对应的String对象A,字面量“wukong”会指向堆中的对象
(2)在类的加载过程中:运行第8行时会在方法区的常量池中创建字面量“wukong2”,同时在堆中创建对应的String对象B,字面量“wukong2”会指向堆中的对象
(3)在运行中,运行到第五行时回去检查常量池中是否存在字面量“wukong2”,发现是存在的,此时a直接指向B
(4)同理b指向A,d指向A.
(5)字符串常量相加,jvm 会进行优化,不会创建 StringBuilder 对象,字符串变量加上常量,会创建 StringBuilder 对象,然后调用 append 方法,因此c是直接指向B的,而e会在堆中创建一新的对象C,对象C的内容与字面量“wukong2”指向的对象B相同。