测试代码
package test04;
//
// protected Object clone()创建并返回对象一个副本。因为是protected类型的方法,只能在子类访问
// 如果使用clone(),需要重写此方法。
// 注意和Student s3=s1;区别,此为地址传递
// 用克隆方法时 :重写此方法的类 必须实现Cloneable接口(这个接口是标记接口,告诉我们实现该接口的类可以实现对象的复制)
//
public class CloneDemo {
public static void main(String[] args) throws CloneNotSupportedException {
Student s1=new Student("zfliu",18);
System.out.println("S1的姓名:"+s1.getName()+",年龄:"+s1.getAge());
//使用clone方法实现克隆
Object obj=s1.clone();
Student s2=(Student)obj;
System.out.println("S2的姓名:"+s2.getName()+",年龄:"+s2.getAge());
//此处也可以实现复制,但是此种方法是将s1的地址给了s3,这是如果改变s3里面的东西s1也会跟着变化,但是由于s2是克隆的s1,所以s2并不会被改变
Student s3=s1;
System.out.println("S3的姓名:"+s3.getName()+",年龄:"+s3.getAge());
s3.setAge(20);
s3.setName("liuzf");
System.out.println("S1的姓名:"+s1.getName()+",年龄:"+s1.getAge());
System.out.println("S2的姓名:"+s2.getName()+",年龄:"+s2.getAge());
System.out.println("S3的姓名:"+s3.getName()+",年龄:"+s3.getAge());
}
}
//此处实现Cloneable接口
class Student implements Cloneable{
private String name;
private int age;
public Student() {
}
public Student(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
输出结果: