一、浅复制
1、Address.java
package com.lh.test.clone;
public class Address {
private String province;
private String city;
private String district;
private String street;
public Address(String province, String city, String district, String street) {
this.province = province;
this.city = city;
this.district = district;
this.street = street;
}
public String getProvince() {
return province;
}
public String getCity() {
return city;
}
public String getDistrict() {
return district;
}
public String getStreet() {
return street;
}
public void setProvince(String province) {
this.province = province;
}
public void setCity(String city) {
this.city = city;
}
public void setDistrict(String district) {
this.district = district;
}
public void setStreet(String street) {
this.street = street;
}
@Override
public String toString() {
return "Address [province=" + province + ", city=" + city + ", district=" + district + ", street=" + street
+ "]";
}
}
2、User.java
package com.lh.test.clone;
public class User implements Cloneable{
private String name;
private Integer age;
private Address address;
public User(String name, Integer age, Address address) {
super();
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public Address getAddress() {
return address;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", address=" + address + "]";
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
3、TestClone.java
package com.lh.test.clone;
public class TestClone {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("Hunan", "Changsha", "Yuelu", "JuZiZhou");
User user = new User("xa", 30, address);
System.out.println(user);
User user2 = (User) user.clone();
System.out.println(user2);
System.out.println(user == user2);
user2.setName("lh");
user2.setAge(20);
Address address2 = user2.getAddress();
address2.setProvince("Guangdong");
address2.setCity("Shenzhen");
address2.setDistrict("Longgang");
address2.setStreet("Bantian");
System.out.println("user: " + user);
System.out.println("user2: " + user2);
}
}
输出结果:
User [name=xa, age=30, address=Address [province=Hunan, city=Changsha, district=Yuelu, street=JuZiZhou]]
User [name=xa, age=30, address=Address [province=Hunan, city=Changsha, district=Yuelu, street=JuZiZhou]]
false
user: User [name=xa, age=30, address=Address [province=Guangdong, city=Shenzhen, district=Longgang, street=Bantian]]
user2: User [name=lh, age=20, address=Address [province=Guangdong, city=Shenzhen, district=Longgang, street=Bantian]]
二、深复制
1、Address.java
package com.lh.test.clone;
public class Address implements Cloneable{
private String province;
private String city;
private String district;
private String street;
public Address(String province, String city, String district, String street) {
this.province = province;
this.city = city;
this.district = district;
this.street = street;
}
public String getProvince() {
return province;
}
public String getCity() {
return city;
}
public String getDistrict() {
return district;
}
public String getStreet() {
return street;
}
public void setProvince(String province) {
this.province = province;
}
public void setCity(String city) {
this.city = city;
}
public void setDistrict(String district) {
this.district = district;
}
public void setStreet(String street) {
this.street = street;
}
@Override
public String toString() {
return "Address [province=" + province + ", city=" + city + ", district=" + district + ", street=" + street
+ "]";
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
2、User.java
package com.lh.test.clone;
public class User implements Cloneable{
private String name;
private Integer age;
private Address address;
public User(String name, Integer age, Address address) {
super();
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public Address getAddress() {
return address;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", address=" + address + "]";
}
@Override
protected Object clone() throws CloneNotSupportedException {
User clonableUser = (User) super.clone();
clonableUser.address = (Address) address.clone();
return clonableUser;
}
}
输出结果:
User [name=xa, age=30, address=Address [province=Hunan, city=Changsha, district=Yuelu, street=JuZiZhou]]
User [name=xa, age=30, address=Address [province=Hunan, city=Changsha, district=Yuelu, street=JuZiZhou]]
false
user: User [name=xa, age=30, address=Address [province=Hunan, city=Changsha, district=Yuelu, street=JuZiZhou]]
user2: User [name=lh, age=20, address=Address [province=Guangdong, city=Shenzhen, district=Longgang, street=Bantian]]