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修饰引用类型变量时,仅表示这个引用变量不可被重新赋值,但引用类型变量所指向的类型依然可以改变。