浅克隆
Person p2 = (Person) p1.clone();
clone()
方法使用后得到p2
,p2
和p1
指向不同的地址。但是如果p1
中的属性是引用类型,那么不再对这个引用类型进行复制,而止于这个引用。
clone类
Ojbect
类中clone()
是protected
修饰,因此需要扩权。在Person
中重写这个方法(并抛出异常)。同时需要实现cloneable
接口,否则将报错。
代码
Person类
public class Person implements Cloneable{
private String name;
private int age;
private Addr addr;
public String getName() {
System.out.println(this+this.name);
return name;
}
public String getAddr() {
System.out.println(this+addr.city);
return addr.city;
}
public void setAddr(String city) {
this.addr.city = city;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
其中Person中的地址,是Addr类型:
public class Addr {
public String city;
}
Test类:
public class Test1 {
public static void main(String[] args) {
Person p1 = new Person();
p1.setAge(11);
p1.setName("xiaoming");
p1.setAddr("南京");
p1.getName();
p1.getAddr();
Person p2=(Person) p1.clone();
p2.getName();
p2.getAddr();
}
}
得到结果,p1
和p2
指定不同的区域,但是他们的addr
指向同一区域。