โคลน() เมธอดใช้ในการสร้างสำเนาของวัตถุของคลาสซึ่งใช้งาน Cloneable อินเตอร์เฟซ. โดยค่าเริ่มต้น จะ การคัดลอกแบบฟิลด์ต่อฟิลด์ เนื่องจากคลาส Object ไม่มีแนวคิดเกี่ยวกับสมาชิกของคลาสเฉพาะที่อ็อบเจ็กต์เรียกวิธีนี้ ดังนั้น หากคลาสมีเฉพาะสมาชิกประเภทข้อมูลพื้นฐาน สำเนาใหม่ของอ็อบเจ็กต์จะถูกสร้างขึ้นและการอ้างอิงถึงสำเนาอ็อบเจ็กต์ใหม่จะถูกส่งคืน แต่ถ้าคลาสมีสมาชิกของประเภทคลาสใดๆ เฉพาะอ็อบเจ็กต์ที่อ้างอิงถึงสมาชิกเหล่านั้นเท่านั้นที่จะถูกคัดลอก และด้วยเหตุนี้ สมาชิกจึงอ้างอิงทั้งในออบเจกต์ดั้งเดิมและอ็อบเจ็กต์ที่ลอกแบบมาจากอ็อบเจกต์เดียวกัน
เราจะได้ CloneNotSupportedException ถ้าเราพยายามเรียก โคลน() เมธอดบนวัตถุของคลาสที่ไม่ได้ใช้ Cloneable อินเตอร์เฟซ. อินเทอร์เฟซนี้เป็นอินเทอร์เฟซสำหรับเครื่องหมาย และการใช้งานอินเทอร์เฟซนี้บ่งชี้ว่า Object.clone() เมธอดสามารถเรียกใช้บนอ็อบเจ็กต์ของคลาสที่นำไปใช้ได้
ไวยากรณ์
protected Object clone() throws CloneNotSupportedException
เราสามารถใช้วิธี clone() ได้สองวิธี
สำเนาตื้น
นี่เป็นผลลัพธ์ของฟังก์ชันการโคลนเริ่มต้นโดย Object.clone() เมธอด ถ้าคลาสมีสมาชิกประเภทข้อมูลที่ไม่ใช่แบบพื้นฐานด้วย ในกรณีของ Shallow Copy วัตถุที่ลอกแบบมายังหมายถึงวัตถุเดียวกันกับที่วัตถุดั้งเดิมอ้างถึง เนื่องจากจะมีการคัดลอกเฉพาะการอ้างอิงวัตถุเท่านั้น ไม่ใช่วัตถุที่อ้างอิง
ตัวอย่าง
public class ShallowCopyTest {
public static void main(String args[]) {
A a1 = new A();
A a2 = (A) a1.clone();
a1.sb.append("Tutorialspoint!");
System.out.println(a1);
System.out.println(a2);
}
}
class A implements Cloneable {
public StringBuffer sb = new StringBuffer("Welcome to ");
public String toString() {
return sb.toString();
}
public Object clone() {
try {
return super.clone();
} catch(CloneNotSupportedException e) {
}
return null;
}
} ผลลัพธ์
Welcome to Tutorialspoint! Welcome to Tutorialspoint!
Deep Copy
เราจำเป็นต้องแทนที่ โคลน() เมธอดสำหรับคลาสที่มีสมาชิกประเภท non-primitive เพื่อให้ได้ Deep Copy เนื่องจากต้องการให้ออบเจ็กต์สมาชิกถูกโคลนด้วย ซึ่งไม่ได้ทำโดยกลไกการโคลนเริ่มต้น
ตัวอย่าง
public class DeepCopyTest {
public static void main(String args[]) {
A a1 = new A();
A a2 = (A) a1.clone();
a1.sb.append(" TutorialsPoint!");
System.out.println(a1);
System.out.println(a2);
}
}
class A implements Cloneable {
public StringBuffer sb = new StringBuffer("Welcome to ");
public String toString() {
return sb.toString();
}
public Object clone() {
try {
A a = (A) super.clone();
a.sb = new StringBuffer(sb.toString());
return a;
}
catch(CloneNotSupportedException e) {
}
return null;
}
} ผลลัพธ์
Welcome to TutorialsPoint! Welcome to