浅拷贝
浅拷贝会在堆上创建一个新的对象,如果原对象的属性是一个引用类型,拷贝的内部对象是原对象内部对象的引用地址,即原对象和拷贝对象用的是同一个内部对象。
class Inner implements Cloneable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Inner(String name) {
this.name = name;
}
@Override
protected Inner clone() throws CloneNotSupportedException {
return (Inner) super.clone();
}
}
class Outer implements Cloneable{
private Inner inner;
public Inner getInner() {
return inner;
}
public void setInner(Inner inner) {
this.inner = inner;
}
public Outer(Inner inner) {
this.inner = inner;
}
@Override
protected Outer clone() throws CloneNotSupportedException {
Outer outer = (Outer) super.clone();
return outer;
}
}
@Test
public void testCopy() throws CloneNotSupportedException {
Outer outer = new Outer(new Inner("inner"));
Outer clone = outer.clone();
System.out.println(outer.getInner() == clone.getInner());
// 输出:true
}
深拷贝
深拷贝会完全复制整个对象,包括原对象的内部对象。
class Inner implements Cloneable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Inner(String name) {
this.name = name;
}
@Override
protected Inner clone() throws CloneNotSupportedException {
return (Inner) super.clone();
}
}
class Outer implements Cloneable{
private Inner inner;
public Inner getInner() {
return inner;
}
public void setInner(Inner inner) {
this.inner = inner;
}
public Outer(Inner inner) {
this.inner = inner;
}
@Override
protected Outer clone() throws CloneNotSupportedException {
Outer outer = (Outer) super.clone();
outer.setInner(new Inner("inner")); // 拷贝一份内部对象
return outer;
}
}
@Test
public void testCopy() throws CloneNotSupportedException {
Outer outer = new Outer(new Inner("inner"));
Outer clone = outer.clone();
System.out.println(outer.getInner() == clone.getInner());
// 输出:false
}
标签:Java,name,clone,基础,Inner,Outer,拷贝,public,inner
From: https://www.cnblogs.com/afabao/p/17085971.html