Java的clone()——浅复制与深复制

一、浅复制

    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]]

参考资料

1、Java的clone():深复制与浅复制

猜你喜欢

转载自my.oschina.net/Howard2016/blog/1787167
今日推荐