โคลน() เมธอดใช้ในการสร้างสำเนาของวัตถุของคลาสซึ่งใช้งาน 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