जावा भाषा स्तर पर क्या आवश्यक है और बाइटकोड स्तर पर क्या आवश्यक है, के बीच एक अंतर है, जो बहुत अधिक लक्सर है।
जावा भाषा स्तर पर, आपके पास पहले कथन के रूप में एक कन्स्ट्रक्टर कॉल होना चाहिए, लेकिन यदि आप इसे छोड़ देते हैं तो संकलक एक अंतर्निहित रूप से सम्मिलित होगा।
बाइटकोड स्तर पर, केवल आवश्यकता यह है कि सामान्य रूप से लौटने वाले प्रत्येक कोड पथ के साथ बिल्कुल एक कन्स्ट्रक्टर कॉल होता है, साथ ही प्रारंभिक से पहले this
मान के साथ आप क्या कर सकते हैं पर प्रतिबंध हैं।
विशेष रूप से, इसका मतलब है कि
- निर्माता कॉल विधि
- आप सशर्त तर्क के आधार पर अलग अलग निर्माताओं बुला बीच चयन कर सकते की शुरुआत में प्रदर्शित करने के
- आप हो सकता है नहीं है सुपरक्लस कन्स्ट्रक्टर
- द्वारा फेंकने वाले अपवादों को शामिल करने वाले अपवाद हैंडलर सहित, यदि प्रत्येक कोड पथ अपवाद फेंकता है या अनंत लूप में जाता है तो आपके पास कोई कन्स्ट्रक्टर कॉल नहीं हो सकता है।
पहला विकल्प वास्तव में javac में प्रकट होता है, कोड उत्पन्न क्योंकि जावा में, आप निर्माता कॉल करने के लिए तर्क के रूप में एक अभिव्यक्ति पारित कर सकते हैं, और कोड की गणना करने के कि अभिव्यक्ति स्पष्ट रूप से निर्माता कहा जाता है से पहले होता है।लेकिन उन शेष विकल्पों को जावा में पूरा करना असंभव है।
ध्यान दें कि यदि आप इन प्रतिबंधों का उल्लंघन करते हैं, तो क्या होगा यदि आप सामान्य जावा कन्स्ट्रक्टर से कन्स्ट्रक्टर कॉल को हटाते हैं जो सामान्य रूप से लौटाता है, तो कन्स्ट्रक्टर अब अमान्य हो जाएगा क्योंकि यह लौटाता है लेकिन इसमें कोई सीटीओआर कॉल नहीं है। इस प्रकार, वर्ग को लोड करने का प्रयास VerifyError के साथ रनटाइम पर विफल हो जाएगा।
पूर्णता के लिए, आप एक अनियमित this
मान के साथ क्या कर सकते हैं: इसे उसी वर्ग में परिभाषित फ़ील्ड को शून्य, और स्टोर (लेकिन पढ़ा नहीं गया) के साथ तुलना करें।
ज्यादा नहीं, है ना? लेकिन सीटीओआर कॉल से पहले एक ही कक्षा में परिभाषित फ़ील्ड को स्टोर करने की क्षमता वास्तव में जावा कंपाइलर द्वारा उपयोग की जाती है। बाइटकोड स्तर पर आंतरिक कक्षाओं की कोई धारणा नहीं है, इसलिए जब आप आंतरिक कक्षा में बाहरी वर्ग का संदर्भ देते हैं, तो संकलक बाहरी वर्ग में एक छिपे हुए क्षेत्र को उत्पन्न करता है जिसमें बाहरी वर्ग का संदर्भ होता है। यह सुनिश्चित करने के लिए कि यह ठीक से काम करता है अगर सुपरक्लस कन्स्ट्रक्टर एक ऐसी विधि को कॉल करता है जो आंतरिक कक्षा में अतिरंजित है और बाहरी वर्ग तक पहुंचता है, तो इस छिपे हुए क्षेत्र को सुपरक्लास कन्स्ट्रक्टर कॉल से पहले प्रारंभ करना होगा। बेशक, जब आप बाइटकोड लिख रहे हों तो आप इसके साथ और भी कुछ कर सकते हैं।
शुरुआत के लिए अपरिभाषित व्यवहार। – EJP
आप क्यों हासिल करना चाहते हैं? या तो सुपर क्लास के अन्य कन्स्ट्रक्टर को कॉल करता है या डिफ़ॉल्ट का उपयोग करता है और आपको कम से कम एक अन्य बुद्धिमान ऑब्जेक्ट को कॉल करने की आवश्यकता नहीं होती है। – Braj
@ ब्राज मुझे लगता है कि यह बौद्धिक जिज्ञासा है, ऐसा करने के लिए कोई सौहार्दपूर्ण कारण नहीं है लेकिन परिणाम दिलचस्प हो सकते हैं कम से कम –