2010-01-31 12 views
51

जावा में abstract कक्षा में constructor क्यों है?जावा में सार कक्षाओं में रचनाकार क्यों हैं?

यह क्या बना रहा है, क्योंकि हम abstract कक्षा को तुरंत चालू नहीं कर सकते हैं?

कोई विचार?

+1

स्पष्टीकरण के लिए इस प्रश्न को देखें, http://stackoverflow.com/questions/260666/abstract-class-constructor-in-java –

+0

आपको एक अमूर्त वर्ग के उप-वर्ग का निर्माण करने का एक तरीका चाहिए। तकनीकी रूप से, एक अमूर्त वर्ग पर एक सार्वजनिक निर्माता वास्तव में केवल एक संरक्षित निर्माता है। –

उत्तर

70

जावा में एक निर्माता है वास्तव में नहीं वस्तु "का निर्माण", यह करने के लिए प्रयोग किया जाता है बुलाया जाएगा खेतों को शुरू करें।

कल्पना कीजिए कि आपके अमूर्त वर्ग में फ़ील्ड x और y है, और आप हमेशा उन्हें एक निश्चित तरीके से प्रारंभ करना चाहते हैं, इससे कोई फर्क नहीं पड़ता कि वास्तव में वास्तविक ठोस उपclass क्या बनाया गया है। तो आप एक कन्स्ट्रक्टर बनाते हैं और इन फ़ील्ड को प्रारंभ करते हैं।

अब, यदि आपके पास अपने अमूर्त वर्ग के दो अलग-अलग उप-वर्ग हैं, तो जब आप उन्हें तत्काल बनाते हैं तो उनके रचनाकारों को बुलाया जाएगा, और फिर अभिभावक कन्स्ट्रक्टर को बुलाया जाएगा और फ़ील्ड प्रारंभ किए जाएंगे।

यदि आप कुछ नहीं करते हैं, तो माता-पिता के डिफ़ॉल्ट निर्माता को बुलाया जाएगा। हालांकि, आप पैरेंट क्लास पर विशिष्ट कन्स्ट्रक्टर का आह्वान करने के लिए सुपर कीवर्ड का उपयोग कर सकते हैं।

 

public class A extends AbstractB{ 

    public A(...){ 
    super(String constructorArgForB, ...); 
    ... 
    } 
} 

 
+4

आम तौर पर, यदि आप कन्स्ट्रक्टर चेनिंग के सिद्धांत को ध्यान में रखते हैं, तो माता-पिता कन्स्ट्रक्टर को पहले – Stranger

+0

निष्पादित करने से पहले माता-पिता का कन्स्ट्रक्टर कहा जाता है, यदि आपके पास अपने अमूर्त वर्ग के दो अलग-अलग उप-वर्ग हैं, तो जब आप उन्हें तत्काल बनाते हैं तो उनके रचनाकारों को बुलाया जाएगा , और फिर अभिभावक कन्स्ट्रक्टर को बुलाया जाएगा और खेतों को शुरू किया जाएगा। 'आपका मतलब है कि पहले बाल-वर्ग के निर्माता को बुलाया जाएगा? : ओ – UnKnown

+0

हर बार जब यह इस तरह बहता है - 'ग्रैंड पेरेंट कन्स्ट्रक्टर' -> 'पैरेंट कन्स्ट्रक्टर' -> 'बाल कन्स्ट्रक्टर' –

7

क्योंकि एक और वर्ग इसे बढ़ा सकता है, और बच्चे वर्ग को सुपरक्लास कन्स्ट्रक्टर का आह्वान करने की आवश्यकता है।

9

सभी सार कक्षाएं constructors.Abstract वर्ग कंस्ट्रक्टर्स हो सकता है सहित कक्षाओं जब इसकी ठोस उपवर्ग

instantiated हो जाएगा
1

कार्यान्वयन बुद्धिमान आप अक्सर सुपर अंदर उपवर्गों कंस्ट्रक्टर्स में() बयान, की तरह कुछ देखेंगे।

इस के लिए
4

क्योंकि सार कक्षाएं राज्य (क्षेत्र) और somethimes वे किसी भी तरह से प्रारंभ करने की आवश्यकता है:

7

दो कारण हैं:

1) सार कक्षाएं constructors है और उन निर्माताओं हमेशा लागू कर रहे हैं जब एक ठोस उपवर्ग instantiated है। हम जानते हैं कि जब हम एक वर्ग को तुरंत चालू करने जा रहे हैं, हम हमेशा उस वर्ग के निर्माता का उपयोग करते हैं। अब प्रत्येक कन्स्ट्रक्टर सुपर क्लास के निर्माता को super() पर एक निहित कॉल के साथ आमंत्रित करता है।

2) हम जानते हैं कि कन्स्ट्रक्टर का उपयोग कक्षा के क्षेत्रों को शुरू करने के लिए भी किया जाता है। हम यह भी जानते हैं कि अमूर्त वर्गों में फ़ील्ड हो सकते हैं और कभी-कभी उन्हें को किसी भी तरह से कन्स्ट्रक्टर का उपयोग करके प्रारंभ करने की आवश्यकता होती है।

+0

देबमल्य दास (एससीजेपी और एससीडब्ल्यूसीडी) – Debmalya

2

मुझे लगता है कि इस सवाल की जड़ यह है कि लोग मानते हैं कि एक कन्स्ट्रक्टर को कॉल ऑब्जेक्ट बनाता है। बात वह नहीं है। जावा कहीं भी दावा नहीं करता है कि एक कन्स्ट्रक्टर कॉल ऑब्जेक्ट बनाता है। यह वही करता है जो हम कन्स्ट्रक्टर करना चाहते हैं, जैसे कुछ क्षेत्रों को शुरू करना .. यह सब कुछ है। तो एक अमूर्त वर्ग के कन्स्ट्रक्टर को बुलाया जाने का मतलब यह नहीं है कि इसका ऑब्जेक्ट बनाया गया है।

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