package test1;public class CloneTest1
{
public static void main(String[] args) throws Exception
{
Student s1=new Student();
s1.setName("zhangsan");
s1.setAge(20);

Student s2=new Student();
s2=(Student)s1.clone();
System.out.println("s1:"+s1.getName()+"\t"+s1.getAge());
System.out.println("s2:"+s2.getName()+"\t"+s2.getAge());
System.out.println("======================================");
s1.setName("lisi");
System.out.println("s1:"+s1.getName()+"\t"+s1.getAge());
System.out.println("s2:"+s2.getName()+"\t"+s2.getAge());
}

}class Student implements Cloneable
{
private int age;
private String name;

public Student()
{

}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Object clone() throws CloneNotSupportedException
{
Object object=(Object)super.clone();
return object;
}

}
==============
看一个视频,讲师的意思这属于浅复制,可要是浅复制
经过这条语句:s1.setName("lisi");后
s2.getName()返回的还是"zhangsan"

解决方案 »

  1.   

    这个是浅复制.
    s2 = s1.clone(),执行后s2引用内存一个Student对象,这个对象的属性和s1所引用的对象的属性值(注意"值")是一样的.即s2的age是20,name是字符串池中的"zhangsan",这些和s1是一样的.
    s2.setName("lisi")后s2所引用的对象的name属性变成"lisi",但s1对象的属性值没有变.
    你可能忽略了一点:即便是浅复制,s1和s2也是不同的两个对象,还有一点就是字符串类型的对象是不可变对象.
      

  2.   

    基本上没有自定义的对象,都是java本身的,这样的话,String也是有clone这个方法的,它复制之后就是两个不同的对象,但是值相同。
    是浅复制,不过String复制是调用String本身实现的Clone
      

  3.   

    不用验证。。 对于使用Object 的 clone 方法来说 如Class中含有 除基本类型 与 String 之外的 引用类型    那么都是浅复制
      

  4.   

    是浅复制没错
    看看浅复制的定义:被复制对象的所有变量都含有与原来的对象相同的值(注意是值),而所有的对其他对象的引用仍然指向原来的对象。
    在调用s1.clone()之后,系统将重新生成一个Student对象,这个对象的age为20,name的引用为字符串常量“zhangsan”,这个引用指向的值跟s1一样。在调用了setname("lisa")之后,由于String常量的不可变性,将重新生成一个值为“lisa”的字符串常量,并且让s2的name指向“lisa”。所以s1的zhangsan还是zhangsan,并没用因为s2对name的改变而改变。
      

  5.   

    顶楼上,不过Object关于clone的代码是native的,怎么能看出其针对String和基本类型都是浅复制的