क्लोन () विधि का उपयोग किसी वर्ग के ऑब्जेक्ट की प्रतिलिपि बनाने के लिए किया जाता है जो क्लोनेबल . को लागू करता है इंटरफेस। डिफ़ॉल्ट रूप से, यह फ़ील्ड-दर-फ़ील्ड कॉपी . करता है चूंकि ऑब्जेक्ट क्लास को उस विशेष वर्ग के सदस्यों के बारे में कोई जानकारी नहीं है, जिनकी वस्तुएं इस विधि को बुलाती हैं। इसलिए, यदि कक्षा में केवल आदिम डेटा प्रकार के सदस्य हैं तो वस्तु की एक नई प्रति बनाई जाएगी और नई वस्तु प्रति का संदर्भ वापस कर दिया जाएगा। लेकिन, यदि कक्षा में किसी भी वर्ग प्रकार के सदस्य हैं तो केवल उन सदस्यों के ऑब्जेक्ट संदर्भों की प्रतिलिपि बनाई जाती है और इसलिए मूल ऑब्जेक्ट के साथ-साथ क्लोन ऑब्जेक्ट दोनों में सदस्य संदर्भ एक ही ऑब्जेक्ट को संदर्भित करते हैं।
हमें एक CloneNotSupportedException . मिलेगा अगर हम क्लोन () . को कॉल करने का प्रयास करते हैं किसी वर्ग के किसी ऑब्जेक्ट पर विधि जो क्लोनेबल . को लागू नहीं करती है इंटरफेस। यह इंटरफ़ेस एक मार्कर इंटरफ़ेस . है और इस इंटरफ़ेस का कार्यान्वयन केवल यह दर्शाता है कि Object.clone() विधि को कार्यान्वयन वर्ग की वस्तुओं पर बुलाया जा सकता है।
सिंटैक्स
protected Object clone() throws CloneNotSupportedException
हम दो तरीकों से क्लोन () विधि को लागू कर सकते हैं
उथली कॉपी
यह Object.clone() . द्वारा प्रदान की गई डिफ़ॉल्ट क्लोनिंग कार्यक्षमता का परिणाम है विधि यदि कक्षा में गैर-आदिम डेटा प्रकार के सदस्य भी हैं। शैलो कॉपी के मामले में, क्लोन किया गया ऑब्जेक्ट भी उसी ऑब्जेक्ट को संदर्भित करता है, जिसे मूल ऑब्जेक्ट संदर्भित करता है क्योंकि केवल ऑब्जेक्ट संदर्भ कॉपी किए जाते हैं, न कि संदर्भित ऑब्जेक्ट।
उदाहरण
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!
डीप कॉपी
हमें क्लोन() . को ओवरराइड करना होगा गैर-आदिम प्रकार के सदस्यों वाली कक्षाओं के लिए डीप कॉपी . प्राप्त करने की विधि क्योंकि इसमें सदस्य वस्तुओं को भी क्लोन करने की आवश्यकता होती है, जो कि डिफ़ॉल्ट क्लोनिंग तंत्र द्वारा नहीं किया जाता है।
उदाहरण
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