【Java基础】浅拷贝和深拷贝

浅拷贝:拷贝对象时,其中的“子对象”未拷贝(地址与原对象相同)。

深拷贝:拷贝对象时,将其中的“子对象”也拷贝一份(地址与原对象不同)。

如何判断拷贝对象的子对象的地址是否与原对象的子对象地址相同?(==与equals的区别:==两边放的是对象时,比较两个对象的地址是否指向同一地址)

package xyh.learn.clonetest;
/**
 * 这是一个地址类,用于存放学生地址
 * @author xyh
 *
 */
public class Addrss implements Cloneable{

	private String  addrssString;

	public String getAddrssString() {
		return addrssString;
	}

	public void setAddrssString(String addrssString) {
		this.addrssString = addrssString;
	}

	public Addrss(String addrssString) {
		super();
		this.addrssString = addrssString;
	}

	/**
	 * 实现了clone方法
	 */
	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}
	
}

下面是该示例的重点部分,在实现clone方法时,区别是浅拷贝还会深拷贝 

package xyh.learn.clonetest;
/**
 * 这是学生类,存放学生信息
 * @author xyh
 *
 */
public class Student implements Cloneable{

	private int age;
	private String name;
	private Addrss addrss;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public Addrss getAddrss() {
		return addrss;
	}
	public void setAddrss(Addrss addrss) {
		this.addrss = addrss;
	}
	
	
	public Student() {
		super();
	}
	public Student(int age, String name, Addrss addrss) {
		super();
		this.age = age;
		this.name = name;
		this.addrss = addrss;
	}
	/**
	 * 重写clone方法(对比浅克隆与深克隆)
	 */
	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		//重写clone方法,实现对Student类的浅拷贝
		return (Student)super.clone();
		
		/**
		 * 重写clone方法,实现整个Student类的深拷贝
		 */
		/*Student newstu=(Student)super.clone();
		newstu.addrss=(Addrss)addrss.clone();
		return newstu ;*/
	}
}

下面是测试代码:

package xyh.learn.clonetest;

public class CloneText {

	public static void main(String[] args) throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		Addrss addrss=new Addrss("地址");
		Student student=new Student(11,"阿达",addrss);
		//将student拷贝到student2中
		Student student2=(Student) student.clone();
		//==号判断的是两个Addrss所指向的地址是否相同
		String result=student.getAddrss()==student2.getAddrss()?"是浅拷贝":"是深拷贝";
		//输出结果
		System.out.println("对于子对象Addrss的拷贝是:"+result);
		//String是一个类,而不是基础数据类型。
		//因为String中没有实现Cloneable中的clone方法,所以String是浅拷贝的
		System.out.println(student.getAddrss().getAddrssString()==student2.getAddrss().getAddrssString()?"是浅拷贝":"是深拷贝");
				
	}

}

下面是对于浅拷贝的运行结果,如果想测试深拷贝与浅拷贝,可以对Student类中的clone方法中的两种情况进行测试。

可以通过阅读String类,分析为何第二个结果也是前拷贝。

猜你喜欢

转载自blog.csdn.net/tzc_xyh/article/details/84981959