class Test extends Object {
public static void main(String[] args) throws CloneNotSupportedException {
Person perSon = new Person();
perSon.setAge(1);
perSon.setName("张三");
Person personClone = (Person) perSon.clone();
personClone.setAge(2);
System.out.println(perSon == personClone);
System.out.println("person:" + perSon.getName() + perSon.getAge());
System.out.println("personClone:" + personClone.getName() + personClone.getAge());
}
}
class Person implements Cloneable {
String name;
int age;
Friend friend;
public Friend getFriend() {
return friend;
}
public void setFriend(Friend friend) {
this.friend = friend;
}
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
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", friend=" + friend +
'}';
}
}
class Friend implements Cloneable {
String name;
int 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
public String toString() {
return "Friend{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
控制台输出:false person:张三1 personClone:张三2
可以看出克隆出了一个person对象。
我们再给Person的Friend属性赋值,然后进行克隆:
public static void main(String[] args) throws CloneNotSupportedException {
Person perSon = new Person();
perSon.setAge(1);
perSon.setName("张三");
Friend friend = new Friend();
friend.setAge(1);
friend.setName("李四");
perSon.setFriend(friend);
Person personClone = (Person) perSon.clone();
Friend cloneFriend = personClone.getFriend();
cloneFriend.setName("王五");
cloneFriend.setAge(2);
System.out.println(perSon.toString());
System.out.println(personClone.toString());
}
控制台输出:
Person{name='张三', age=1, friend=Friend{name='王五', age=2}}
Person{name='张三', age=1, friend=Friend{name='王五', age=2}}
可以看出Person的引用属性Friend并没有克隆出来,两个person的friend都是指向同一个。
对Person的clone方法重新改写下:
@Override
public Object clone() throws CloneNotSupportedException {
Person person = (Person) super.clone();
person.setFriend((Friend) person.getFriend().clone());
return person;
}
重新输出:
Person{name='张三', age=1, friend=Friend{name='李四', age=1}}
Person{name='张三', age=1, friend=Friend{name='王五', age=2}}
总而言之:如果一个对象有引用对象属性时,通过return super.clone()只能克隆出基本属性,其引用属性无法克隆出来。