2013-04-16 5 views
6

क्लास पैरामीटरेटेड कन्स्ट्रक्टर है, तो जावा डिफ़ॉल्ट कन्स्ट्रक्टर क्यों प्रदान नहीं करता है? निम्न उदाहरणक्लास पैरामीटरेटेड कन्स्ट्रक्टर है, तो जावा डिफ़ॉल्ट कन्स्ट्रक्टर क्यों प्रदान नहीं करता है?

class A { 
    int a; 

    public A() { 
    } 

    public A(int val) { 
     a = val; 
    } 
} 

पर विचार करें यहाँ मैं स्पष्ट रूप से डिफ़ॉल्ट निर्माता जोड़ने की जरूरत है। क्या कोई कारण है, क्यों जावा पैरामीट्रिज्ड कन्स्ट्रक्टर वाले वर्ग के लिए डिफॉल्ट कन्स्ट्रक्टर प्रदान नहीं करता है?

+0

मुझे नहीं लगता कि यह एक डुप्लिकेट है; यह पूछ रहा है * क्यों * विनिर्देश कहता है कि यह क्या करता है। – OrangeDog

+0

@ ऑरेंजडॉग यहां कठिनाई यह है कि ओपी के प्रश्न का शाब्दिक उत्तर है * "एक कंपाइलर एक डिफॉल्ट कन्स्ट्रक्टर उत्पन्न नहीं करता है जब आप स्पष्ट रूप से एक कन्स्ट्रक्टर को परिभाषित करते हैं क्योंकि डिफ़ॉल्ट कन्स्ट्रक्टर की परिभाषा है 'एक संकलक परिभाषित करता है जब आप परिभाषित नहीं करते हैं और एक'"*। (उनका 'सार्वजनिक ए() {} 'एक डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है।) ओपी शायद शब्दावली को मिश्रण कर रहा था और * संभवतः * वास्तव में नो-तर्क कन्स्ट्रक्टर के बारे में पूछ रहा था। हो सकता है कि अगर हम मान लें कि ओपी शब्दावली को मिला रहा है तो सवाल संपादित किया जाना चाहिए। – Radiodef

उत्तर

2

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

यदि आपके पास कोई कन्स्ट्रक्टर परिभाषित है, (यहां तक ​​कि बिना किसी तर्क के) भी कंपाइलर आपको एक और नहीं देगा।

यह इस तरह काम करता है क्योंकि इसे इस तरह से निर्दिष्ट किया गया था। आप इसके बारे में Language Specification

+4

ओपी जानता है कि 'क्लास पैरामीटरेटेड कन्स्ट्रक्टर' है, तो जावा डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान नहीं करता है। प्रश्न "क्यों" है? – Pshemo

9

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

5

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

2

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

वर्तमान व्यवस्था यह सुनिश्चित करके उस समस्या को समाप्त करती है जब डिफ़ॉल्ट अक्षम हो जाता है तो एक और कन्स्ट्रक्टर होता है।

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