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());
}
    public Name getName()
{
//return name;
return new Name(name.getFirstName(), name.getLastName());
}
public static void main(String[] args)
{
Name n = new Name("悟空", "孙");
Person p = new Person(n);

System.out.println(p.getName().getFirstName());

n.setFirstName("八戒");

System.out.println(p.getName().getFirstName());
}
}

解决方案 »

  1.   

    final 关键字声明的基本变量 表示其值不可改变对于对象变量来说 是其引用不可改变this.name = name  person类中的name变量只能指向传进来的对象变量 不可改变

    this.name = new Name(name.getFirstName(), name.getLastName())  虽然name变量指向新new出来的那个对象 但是这个对象 内的内容是 由传进来的name对象 确定的 所以会变化