2013-08-26 7 views
6

के फायदे मैं जावा के लिए बहुत नया हूं और विषय सीखने की कोशिश कर रहा हूं, जिसमें केवल HTML/CSS में पिछले प्रोग्रामिंग एक्सपोजर है। मैंने हरबर्ट शिलल्ट के साथ शुरुआत की है और कुछ पृष्ठों के माध्यम से प्रगति की है।कन्स्ट्रक्टर ओवरलोडिंग

मैं कन्स्ट्रक्टर ओवरलोडिंग के सटीक फायदों को समझने में असमर्थ हूं। लचीलापन के लिए सिंगल कन्स्ट्रक्टर का उपयोग करके विधियों को ओवरलोड करना आसान नहीं है? इसके अलावा यदि मैं एक ऑब्जेक्ट का उपयोग करने के लिए एक ऑब्जेक्ट का उपयोग करने के लिए कन्स्ट्रक्टर ओवरलोडिंग का उपयोग करने की कोशिश कर रहा हूं, तो इसे करने के सरल तरीके हैं! तो लाभ क्या हैं और किस स्थिति में मैं कन्स्ट्रक्टर ओवरलोडिंग का उपयोग करूँगा।

+0

बहुत अच्छा प्रश्न! –

+0

क्या Schildt की प्रतिष्ठा जावा की बात आती है? मुझे याद है कि वह मूल रूप से एक हँसते हुए थे जब उन्होंने सी और सी ++ के बारे में किताबें लिखने की कोशिश की ... – cHao

+0

श्ल्डट की जावा पुस्तक अच्छी है ... सी और सी ++ के बारे में नहीं पता। यह जावा पुस्तक बहुत बुनियादी से शुरू होती है। तो किसी के लिए, जो ओओपी और जावा के लिए नया है, यह वास्तव में प्रबुद्ध है। –

उत्तर

5

निर्माता से अधिक भार अनुकरण मूलभूत मूल्यों के लिए बहुत उपयोगी है, या पहले से मौजूद उदाहरण (कॉपी) से एक वस्तु के निर्माण के लिए
यहाँ एक उदाहरण है:

public class Color { 

    public int R, G, B, A; 

    // base ctr 
    public Color(int R, int G, int B, int A) { 
     this.R = R; 
     this.G = G; 
     this.B = B; 
     this.A = A; 
    } 

    // base, default alpha=255 (opaque) 
    public Color(int R, int G, int B) { 
     this(R, G, B, 255); 
    } 

    // ctr from double values 
    public Color(double R, double G, double B, double A) { 
     this((int) (R * 255), (int) (G * 255), (int) (B * 255), (int) (A * 255)); 
    } 

    // copy ctr 
    public Color(Color c) { 
     this(c.R, c.G, c.B, c.A); 
    } 

} 

यहाँ, पहले निर्माता बहुत सरल है। आप आर, जी, बी & रंग के लिए अल्फा मान निर्दिष्ट करते हैं।

हालांकि यह रंग वर्ग का उपयोग करने के लिए पर्याप्त है, तो आप एक दूसरे निर्माता, लीटर है, जो ऑटो आवंटित 255 यदि उपयोगकर्ता द्वारा निर्दिष्ट नहीं अल्फा के लिए प्रदान करते हैं।

तीसरा सीआरआर दिखाता है कि आप अपने कलर ऑब्जेक्ट को 0 और 1 के बीच दोहराकर पूर्णांक के बजाय तत्काल कर सकते हैं।

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

लाभ वास्तव में भी निहित है कि पहले निर्माता हमेशा कहा जाता है, और आप उस का उपयोग मैन्युअल रूप से अपने उदाहरणों गिनती करने के लिए कर सकते हैं। माना कि आप private static int count=0 विशेषता है, तो आप इस तरह रंग उदाहरण की संख्या को ट्रैक कर सकते हैं:

// base ctr 
    public Color(int R, int G, int B, int A) { 
     this.R = R; 
     this.G = G; 
     this.B = B; 
     this.A = A; 
     ++count; 
    } 

count किसी भी निर्माता से वृद्धि की जाती है।

0

जब आप immutable classes से निपट रहे हैं और आप उन्हें तुरंत चालू करने के कई तरीके प्रदान करना चाहते हैं, तो कन्स्ट्रक्टर को ओवरलोड करना सुविधाजनक है।

+1

आप * एक कन्स्ट्रक्टर को प्रस्तुत करने वाले कई फैक्ट्री विधियों के साथ ऐसा कर सकते हैं। लेकिन शायद यह धोखा दे रहा होगा ;-) –

1

यह पूरी तरह से निर्भर करता है कि आप अपनी वस्तु का निर्माण कैसे कर रहे हैं।

कन्स्ट्रक्टर ओवरलोडिंग का शास्त्रीय उदाहरण जावा में ऐरेलिस्ट है। ArrayList में तीन रचनाकार हैं जो एक खाली है, अन्य संग्रह वस्तु लेता है और कोई प्रारंभिक क्षमता लेता है। सरणी सूची वस्तु बनाते समय इन अधिभारित कन्स्ट्रक्टर लचीलापन की अनुमति देता है। यह संभव हो सकता है कि आप सृजन के दौरान सरणीसूची के आकार को नहीं जानते हैं, आप बस डिफ़ॉल्ट तर्क तर्क निर्माता का उपयोग कर सकते हैं, लेकिन यदि आप आकार जानते हैं तो अधिभारित कन्स्ट्रक्टर का उपयोग करने के लिए सबसे अच्छा है जो क्षमता लेता है। चूंकि ऐरेलिस्ट को किसी अन्य संग्रह से भी बनाया जा सकता है, इसलिए एक और अधिभारित कन्स्ट्रक्टर होने की तुलना में किसी अन्य सूची से हो सकता है। अधिभारित कन्स्ट्रक्टर का उपयोग करके आप अपने ऐरेलिस्ट को सेट या किसी अन्य संग्रह में परिवर्तित कर सकते हैं।

More info सामान्य उदाहरणों के साथ।

1

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

एक विधि "मजबूर" नहीं होगा ओवरलोडिंग किसी निर्माता, जहां आप उन paremeters गुजर बिना एक वस्तु instanciate नहीं कर सकते में पैरामीटर होने के विपरीत यह कॉल करने के लिए।

किसी ऑब्जेक्ट को बनाने के लिए कई तरीके उपयोगी हो सकते हैं, जैसे Color वर्ग, एनएनजे के उत्तर में, चार अलग-अलग तरीकों से बनाया जा सकता है। प्रत्येक तरीका यह सुनिश्चित करता है कि Color न्यूनतम सूचनाओं के रूप में उपयोगी हो या "काम" हो।

उन जानकारियां अगर Color केवल पैरामीटर के बिना एक contructor था और वर्ग "काम" करने के लिए याद किया जा सकता,, setR और अन्य तरीकों ... जो Color वर्ग में मौजूद नहीं है कॉल करने के लिए किया जाएगा।

0

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

+1

** हमेशा ** एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान करने की आवश्यकता नहीं है। – proskor

+0

यह एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान करने के लिए ** चाहता था ** भी नहीं हो सकता है। –

+0

यदि कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है .. और आप वर्ग को किसी अन्य वर्ग द्वारा बढ़ाया गया है .. उदाहरण के लिए कहें कि यूआर क्लास ए है जिसमें डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है .. क्लास बी ए बढ़ाता है ... कक्षा बी की वस्तु बनाते समय .. यदि आप बी बी = नया बी() कहते हैं; तब फिर क्या होगा? – user2714918

2

निर्माता से अधिक भार का सबसे सरल उदाहरण को ध्यान में रखते:

Class A 
{ 
int a; 

A() 
{ 
this.a = 0; 
} 

A(int a) 
{ 
this.a = a; 
} 

} // end class 

लाभ: अब मैं बस एक और अधिक गतिशील मामले के लिए क्या मूल्य यह होना चाहिए निर्दिष्ट मूलभूत मूल्यों आवंटित करने के लिए डिफ़ॉल्ट निर्माता new A() उपयोग करने की आवश्यकता हो सकती है या new A(10) जो एक पैरामीटरयुक्त कन्स्ट्रक्टर है। do read this question

नहीं यह लचीलेपन के लिए एक निर्माता का उपयोग कर अधिभार के तरीके के लिए आसान है?

निर्माता का कार्य वस्तु को तुरंत चालू करना है, और विधि का कार्य ऑब्जेक्ट मानों को संसाधित करना है। इस प्रकार प्रसंस्करण के लिए तरीकों को सीमित वस्तु के निर्माण के लिए (setter methods को अपवाद) और निर्माता एक लंबे समय में मदद और भी अपने वर्ग और अधिक अपने टीम के साथियों

इसके अलावा करने के लिए उपयोगी बनाने के अगर मैं करने के लिए अधिक भार निर्माता का उपयोग करने के कोशिश कर रहा हूँ जाएगा किसी अन्य को आरंभ करने के लिए एक ऑब्जेक्ट का उपयोग करें, ऐसा करने के सरल तरीके हैं!

विकल्प initializer है, also read

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