Java不可变类
- 不可变类(Immutable Objects):当类的实例一经创建,其内容便不可改变,即无法修改其成员变量。
- 可变类(Mutable Objects):类的实例创建后,可以修改其内容。
Java 中八个基本类型的包装类和 String 类都属于不可变类,而其他的大多数类都属于可变类。
String s = "laoqiang";
System.out.println(s);
s = "newlaoqiang";
System.out.println(s);
这样的代码似乎好像是可以修改的,其实不然,第二次赋值的时候,已经构造了一个新的实例对象,并s指向了它。原来的对象还在那。
引用不可变
实例的引用的不可变。
使用关键字 final 修饰的字段初始化后是不可变的,而这种不可变就是指引用的不可变。具体就是该引用所指对象的内存地址是不可变的,但并非该对象不可变。
Test211 t = new Test211();
final MyInner m = t.new MyInner();
//m= t.new MyInner();该语句无法编译,m的引用指向不可以改变
m.age = 20;
System.out.println(m.age);//该对象的属性是可以修改的
}
class MyInner{
private int age = 10;
}
看到这里,你一定想去final修饰常量的形式:
public final static int age = 10;
public static void main(String[] args) {
age = 12;//编译无法通过,我们在之前说过,这
//里的赋值,实际上是开辟了一个新的实例对象,而final修饰
//的字段,它的指向是不能改,所以编译不过
}
不可变类的实现
对于成员变量的赋值,采用的是clone方法,如果成员变量是引用类型,那么就要按照深拷贝去处理,详细可以查看我的文章这里写链接内容