關於 Cloneable 介面 和 重寫 Object.clone() 方法的嘗試順便複習深拷貝和淺拷貝
阿新 • • 發佈:2019-02-19
一個類如果想重寫 Object 的 clone 方法,則必須實現 Cloneable 介面,否則呼叫 clone 方法時將會丟擲 CloneNotSupportException 異常
/**
* Author: heatdeath
* Date: 2018/7/7
* Desc:
*/
public class CloneDemo {
static class CloneClass {
public String str;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public static void main(String[] args) throws Exception {
CloneClass cloneClass1 = new CloneClass();
System.out.println(cloneClass1);
cloneClass1.str = "hello world";
CloneClass cloneClass2 = (CloneClass) cloneClass1.clone();
System.out.println(cloneClass2);
System.out.println(cloneClass2.str);
}
}
com.heatdeath.test_package.CloneDemo$CloneClass@4554617c
Exception in thread "main" java.lang.CloneNotSupportedException: com.heatdeath.test_package.CloneDemo$CloneClass
at java.lang.Object.clone(Native Method)
at com.heatdeath.test_package.CloneDemo$CloneClass.clone(CloneDemo.java:14)
at com .heatdeath.test_package.CloneDemo.main(CloneDemo.java:23)
正確的方式是,實現 Cloneable 介面,再重寫 clone 方法(通常直接呼叫 super.clone() 方法,即 Object 類中受保護的 native clone 方法即可)
public class CloneDemo {
static class CloneClass implements Cloneable {
public String str;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public static void main(String[] args) throws Exception {
CloneClass cloneClass1 = new CloneClass();
System.out.println(cloneClass1);
cloneClass1.str = "hello world";
CloneClass cloneClass2 = (CloneClass) cloneClass1.clone();
System.out.println(cloneClass2);
System.out.println(cloneClass2.str);
}
}
com.heatdeath.test_package.CloneDemo$CloneClass@4554617c
com.heatdeath.test_package.CloneDemo$CloneClass@74a14482
hello world
Process finished with exit code 0
再捎帶著複習一下淺拷貝和深拷貝好了
淺拷貝 demo
public class CloneDemo {
static class CloneClass implements Cloneable {
public String str;
public Hello helloRef;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
static class Hello {
}
public static void main(String[] args) throws Exception {
CloneClass cloneClass1 = new CloneClass();
System.out.println(cloneClass1);
cloneClass1.str = "hello world";
cloneClass1.helloRef = new Hello();
System.out.println(cloneClass1.helloRef);
CloneClass cloneClass2 = (CloneClass) cloneClass1.clone();
System.out.println(cloneClass2);
System.out.println(cloneClass2.str);
System.out.println(cloneClass2.helloRef);
}
}
深拷貝
public class CloneDemo {
static class CloneClass implements Cloneable {
public String str;
public Hello helloRef;
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
((CloneClass) obj).helloRef = (Hello) helloRef.clone();
return obj;
}
}
static class Hello implements Cloneable {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public static void main(String[] args) throws Exception {
CloneClass cloneClass1 = new CloneClass();
System.out.println(cloneClass1);
cloneClass1.str = "hello world";
cloneClass1.helloRef = new Hello();
System.out.println(cloneClass1.helloRef);
CloneClass cloneClass2 = (CloneClass) cloneClass1.clone();
System.out.println(cloneClass2);
System.out.println(cloneClass2.str);
System.out.println(cloneClass2.helloRef);
}
}