9

क्या जावा में सी ++ के रूप में एक डिफ़ॉल्ट प्रतिलिपि निर्माता है? यदि इसमें कोई है - क्या यह स्पष्ट रूप से उपयोग करता है अगर मैं एक और कन्स्ट्रक्टर (एक प्रतिलिपि नहीं) स्पष्ट रूप से घोषित करता हूं?क्या जावा में एक डिफ़ॉल्ट प्रतिलिपि निर्माता है (जैसे सी ++ में)?

+0

एक प्रतिलिपि निर्माता द्वारा, क्या आपका मतलब एक निर्माता है जो एक ही प्रकार की वस्तु स्वीकार करता है, और इसे डुप्लिकेट करता है? यदि हां - तो नहीं, जावा के पास ऐसा नहीं है। – Cruncher

+0

नहीं, इसमें कोई डिफ़ॉल्ट प्रतिलिपि नहीं है। –

+2

http://stackoverflow.com/questions/827785/why-doesnt-java-have-a-copy-constructor – Cruncher

उत्तर

8

जावा में कॉपी कन्स्ट्रक्टर में बुलेट-इन नहीं है।

लेकिन आप अपने स्वयं के ऐसे रचनाकार लिख सकते हैं। नीचे एक उदाहरण देखें:

class C{ 
    private String field; 
    private int anotherField; 
    private D d; 

    public C(){} 

    public C(C other){ 
     this.field = other.field; 
     this.anotherField = other.anotherField; 
     this.d = new D(other.d); //watch out when copying mutable objects; they should provide copy constructors, as well. Otherwise, a deep copy may not be possible 
    } 

    //getters and setters 
} 

class D{//mutable class 

    //fields 
    public D(D other){ 
     //this is a copy constructor, like the one for C class 
    } 
} 
+0

यह सही है। –

+1

@RomanVottner विस्तृत करने के लिए, यह हमेशा आसान नहीं होता है, खासकर यदि आप उन क्षेत्रों में से किसी एक को नहीं बदल सकते हैं जो इसे कॉपी कॉपी करने वाला है। – Cruncher

4

जावा में एक डिफ़ॉल्ट प्रतिलिपि निर्माता नहीं है। आपको इसे स्वयं परिभाषित करने की आवश्यकता होगी।

2

नहीं, इसमें डिफ़ॉल्ट प्रतिलिपि निर्माता नहीं है। एक डिफ़ॉल्ट कन्स्ट्रक्टर।

आप अपने वर्ग के लिए किसी भी constructors प्रदान करने के लिए नहीं है, लेकिन आप सावधान जब ऐसा करने का होना चाहिए। कंपाइलर स्वचालित रूप से बिना किसी रचना के किसी भी वर्ग के लिए कोई तर्क, डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान करता है। यह डिफ़ॉल्ट कन्स्ट्रक्टर सुपरक्लास के नो-तर्क कन्स्ट्रक्टर को कॉल करेगा। इस स्थिति में, अगर सुपर क्लास नो तर्क निर्माता नहीं है तो आप सत्यापित करना होगा कि यह करता है संकलक शिकायत करेंगे। यदि आपकी कक्षा में कोई स्पष्ट सुपरक्लास नहीं है, तो उसके पास ऑब्जेक्ट का एक अंतर्निहित सुपरक्लास है, जिसमें कोई तर्क-तर्ककर्ता नहीं है।

आमतौर पर मैं एक एक की तरह प्रदान करते हैं

public class CopyConEx { 

     /** 
     * Regular constructor. 
     */ 
     public CopyConEx(type field1, type field2) { 
     this.field1 = field1; 
     this.field2 = field2; 
     } 

     /** 
     * Copy constructor. 
     */ 
     public CopyConEx(CopyConEx aCopyConEx) { 
     this(aCopyConEx.getField1(), aCopyConEx.getField2()); 

     } 
2

एक प्रतिलिपि निर्माता (लेकिन नहीं डिफ़ॉल्ट एक) नहीं है, लेकिन यह कहा जाना चाहिए स्पष्ट (C++ में यह हूँ परोक्ष जब जरूरत कहा जा):

public MyClass(MyClass toCopy) { 
    someField = toCopy.someField; 
} 
+0

यह *** डिफ़ॉल्ट *** नहीं है। आपको इसे स्वयं परिभाषित करना होगा। – dcsohl

+1

यही मेरा मतलब था .. – Maroun

1

जावा समर्थन क्लोनिंग लेकिन कॉपी कन्स्ट्रक्टर का उपयोग नहीं कर रहा है। कृपया जावा क्लोनिंग पर यूआरएल नीचे पाएं।

http://adtmag.com/articles/2000/01/18/effective-javaeffective-cloning.aspx

+0

यदि आप किसी अन्य उत्तर को पढ़ते हैं, तो आप पाएंगे कि जावा कॉपी कॉपी कन्स्ट्रक्टर का समर्थन करता है। वे * डिफ़ॉल्ट * से नहीं हैं, डिफ़ॉल्ट रूप से 'क्लोन() 'से अधिक समर्थित है (आपको' क्लोनेबल 'लागू करना होगा और' क्लोन() 'स्वयं को परिभाषित करना होगा)। (और आपका लेख लगभग 14 वर्ष पुराना है ... यकीन नहीं है कि मैं अभी भी जावा 1.2 के दिनों में लिखी गई कुछ चीज़ों पर भरोसा रखूंगा।) – dcsohl

0

जैसा सी ++, जावा भी प्रतिलिपि निर्माता का समर्थन करता है। लेकिन, सी ++ के विपरीत, जावा एक डिफ़ॉल्ट प्रतिलिपि बनाने वाला नहीं बनाता है यदि आप अपना खुद का नहीं लिखते हैं।

इसके अलावा write a Copy Constructor using Deep copy.

+0

सिर्फ जावा जोड़ने के लिए एक डिफ़ॉल्ट प्रतिलिपि नहीं है, इसके लिए बहुत आवश्यकता नहीं है सामान्य परिस्थितियों में। यह केवल जावा में संदर्भ से गुजरता है। – Anugoonj

1

देखने के जावा में एक स्वत: प्रतिलिपि निर्माता के प्रावधान व्यर्थ होगा।

जावा को एक की आवश्यकता नहीं है क्योंकि आपके पास केवल संदर्भ ऑब्जेक्ट्स के लिए हो सकते हैं। (सी ++ में आप वस्तुओं को मूल्य से गुजर सकते हैं ताकि व्याकरण को स्वचालित ऑब्जेक्ट प्रतिलिपि की अनुमति हो)।

यदि आपको जावा में ऑब्जेक्ट की गहरी प्रतियां लेने की आवश्यकता है, तो Cloneable लागू करें।

संबंधित मुद्दे