class StringTest
{
 public static void main(String[] args)
 {
  Professor p=new Professor("wangwu",50);
  Student s1=new Student("zhangsan",18,p);
  Student s2=(Student)s1.clone();
  s2.p.name="lisi";
  s2.p.age=30;
  System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
 }
}class Professor implements Cloneable
{
String name;
int age;
Professor(String name,int age)
{
this.name=name;
this.age=age;
}
}
}
class Student implements Cloneable
{
String name;
int age;
Professor p;
Student(String name,int age,Professor p)
{
this.name=name;
this.age=age;
this.p=p;
}
public Object clone()
{
Object o=null;
try
{
o=(Student)super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}

return o;
}
}
class Point
{
int x,y;
public String toString()
{
return "x="+x+","+"y="+y;
}
}以上是代码``我想问,为什么用clone()方法的时候,s2.age和s2.name的值为什么不发生变化?而s2.p.name和s2.p.age会发生变化呢?s2.age是int型所以copy的是值这个我知道,但是s2.name和s2.p.name,s2.p.age是引用类型,应该都会发生变化呀``不明白,网上给出的答案就是s2.name是string类型,相当于一个常量,所以不发生变化``但是我不太明白``请大家指点一下``

解决方案 »

  1.   

    class  StringTest  
    {  
     public  static  void  main(String[]  args)  
     {  
       Professor  p=new  Professor("wangwu",50);  
       Student  s1=new  Student("zhangsan",18,p);  
       Student  s2=(Student)s1.clone();  
       s2.p.name="lisi";  
       s2.p.age=30;  
       System.out.println("name="+s1.p.name+","+"age="+s1.p.age);  
     }  
    }  
     
    class  Professor  
    {  
               String  name;  
               int  age;  
               Professor(String  name,int  age)  
               {  
                           this.name=name;  
                           this.age=age;  
               }  
                          
    }  
    class  Student  implements  Cloneable  
    {  
               String  name;  
               int  age;  
               Professor  p;  
               Student(String  name,int  age,Professor  p)  
               {  
                           this.name=name;  
                           this.age=age;  
                           this.p=p;  
               }  
               public  Object  clone()  
               {  
                           Object  o=null;  
                           try  
                           {  
                                       o=super.clone();  
                           }  
                           catch(CloneNotSupportedException  e)  
                           {  
                                       System.out.println(e.toString());  
                           }  
                             
                           return  o;  
               }  
    }  
    class  Point  
    {  
               int  x,y;  
               public  String  toString()  
               {  
                           return  "x="+x+","+"y="+y;  
               }  
    }  这才是完整代码上面代码有错`不好意思``
      

  2.   

    这就是深浅clone()的区别吧.如果你没有覆盖object的clone()方法,它是进行简单的复制.首先是对s1 克隆,这时候它们所指向的p(在堆区)是一样的,而name是指向一个地方(字符串池中,不能改变值,因为你构造的时候是直接给字符串).所以当你这样s1.name="DDDDD",这时候s1.name指向了新的字符串.s2.name还是指向原来的地方.通过s1.name并不能改变s2.name,因为指向的是字符串池.但是s1里的p没有被克隆.只有一个对像p.所以通过任何一个改变都会改变它.
    s1.name和s2.name是不同的对像.虽然它们的值相同.
    s1里的name和s2里的name是不同的对像,它们的值(都是地址值,这个地址值指向的内存地址里是字符值)相等.不知道你能明白吗?我猜测当你构造的时候用
    Student  s1=new  Student(new String("zhangsan"),18,p);再通过s1.name="AAA"后s2.name应该也是=="AAA";
      

  3.   

    后来的结论是错误的哦.
    Student  s1=new  Student(new String("zhangsan"),18,p);再通过s1.name="AAA"后s2.name应该也是=="AAA";
    根本不成立
      

  4.   

    s1.name和s2.name 是不同的对像,刚开始都是指向同个地方,然后s1.name="DDDD"指向了不同的地址了.s2.name还是指向原来的地方.s1.p.name 和s2.p.name是指向同一个地方.
    public  Object  clone()  
    {  
    Object  o=null;   o=new Student(this.name,this.age,new Professor(this.p.name,this.p.age) ); 

    return  o;  
    }呵呵...好像我想得有点多余了.