《疯狂JAVA讲义》不可变类

class Name
{
    private String firstName;
    private String lastName;
    public Name(){}
    public Name(String firstName,String lastName){
        this.firstName=firstName;
        this.lastName=lastName;
    }
    public void setFirstName(String firstName){
        this.firstName=firstName;
    }
    public String getFirstName(){
        return this.firstName;
    }
    public void setLastName(String lastName){
        this.lastName=lastName;
    }
    public String getLastName(){
        return this.lastName;
    }
}
public class Person
{
    private final Name name;
    public Person(Name name){
    //    this.name=name;
    this.name=new Name(name.getFirstName(),name.getLastName());//change1
    }
    public Name getName(){
    //    return name;
        return new Name(name.getFirstName(),name.getLastName());//change2
    }
    public static void main(String[] args){
        Name n= new Name("wukong","sun");
        Person p=new Person(n);
        System.out.println(p.getName().getFirstName());
        n.setFirstName("bajie");
        System.out.println(p.getName().getFirstName());
    }
}

备注为change1和change2的地方是修改过的地方,当程序向Person构造器里传入一个Name对象时,该构造器创建Person对象时并不是直接利用已有的Name对象,而是重新创建了一个Name对象来赋给Person对象的nameField,因为这个已有的name对象时可变的。

当使用final修饰引用类型变量时,仅表示这个引用变量不可被重新赋值,但引用类型变量所指向的类型依然可以改变。

原文地址:https://www.cnblogs.com/whutqueqiaoxian/p/5711316.html