2015-01-21 11 views
5

के मान लेते हैं कि हम एक वर्ग है:बेनामी प्रारंभ

public class SomeClass {  
    protected SomeClass() { 
    } 
} 

MainClass में अलग पैकेज में स्थित मैं दो पंक्तियों पर अमल करने की कोशिश की:

public static void main(String[] args) { 
    SomeClass sac1 = new SomeClass(); 
    SomeClass sac2 = new SomeClass() {}; 
} 

वजह से protected निर्माता, में दोनों मामलों में मैं प्रोग्राम विफल होने की उम्मीद कर रहा था। मेरे आश्चर्य के लिए, अनाम प्रारंभिकता ठीक काम किया। क्या कोई मुझे समझा सकता है कि प्रारंभिकरण की दूसरी विधि ठीक क्यों है?

उत्तर

8

आपके गुमनाम वर्ग

SomeClass sac2 = new SomeClass() {}; 

मूल रूप से

public class Anonymous extends SomeClass { 
    Anonymous() { 
     super(); 
    } 
} 

निर्माता पहुँच नहीं संशोधक है हो जाता है, ताकि आप एक ही पैकेज के भीतर से समस्या के बिना यह आह्वान कर सकते हैं। आप super() भी आ सकते हैं क्योंकि protected पैरेंट कन्स्ट्रक्टर एक उप-वर्ग निर्माता से पहुंच योग्य है।

+0

मेरे आश्चर्य की बात है, वही बात तब होती है जब आप एक ऐसे कन्स्ट्रक्टर का उपयोग करते हैं जिसमें तर्क होता है। इस मामले में मुझे लगता है कि आपकी व्याख्या अब खड़ी नहीं है। – Andrei

+0

@Andrei मैंने पैरामीटर/तर्क का उल्लेख नहीं किया। वे अभिगम्यता जांच में कोई भूमिका निभाते हैं। –

+0

एक्सेसिबिलिटी चेक में नहीं, नहीं। लेकिन अगर आपके पास पैरा के साथ केवल संरक्षित कन्स्ट्रक्टर वाला वर्ग है, तो आपको बच्चे से पैरामीटर के साथ अपने कन्स्ट्रक्टर को स्पष्ट रूप से आमंत्रित करना होगा। मैं कह रहा था कि यह नियम गुमनाम वर्गों के लिए छोड़ दिया गया प्रतीत होता है। – Andrei

3

पहली पंक्ति में विफल रहता है, क्योंकि SomeClass रों पैकेज के निर्माता protected और MainClassSomeClass में नहीं है ', और यह MainClass उपवर्गीकरण नहीं है।

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

0

आपका लाइन

SomeClass sac2 = new SomeClass() {}; 

एक नया वर्ग जो SomeClass फैली का एक उदाहरण बनाता है। चूंकि SomeClass बिना किसी तर्क के संरक्षित कन्स्ट्रक्टर को परिभाषित करता है, इसलिए एक बाल वर्ग इस लाइन में हो रहा है जो अपने स्वयं के कन्स्ट्रक्टर में यह स्पष्ट रूप से कॉल कर सकता है।

2

SomeClass sac2 = new SomeClass() {}; 

में उन दो छोटे ब्रेसिज़ जावा में स्वत: व्यवहार का एक बहुत आह्वान। यहां बताया गया है कि उस पंक्ति को कब निष्पादित किया जाता है:

  1. SomeClass का अज्ञात सबक्लास बनाया गया है।
  2. उस अज्ञात सबक्लास को किसी भी अन्य जावा क्लास की तरह डिफॉल्ट नो-तर्क कन्स्ट्रक्टर दिया जाता है, जिसे बिना तर्क-तर्क कन्स्ट्रक्टर के घोषित किया जाता है।
  3. डिफ़ॉल्ट कोई तर्क निर्माता दृश्यता public
  4. डिफ़ॉल्ट कोई तर्क निर्माता super() कॉल करने के लिए (जो क्या कोई आर्ग कंस्ट्रक्टर्स हमेशा पहले करते हैं) परिभाषित किया गया है के साथ परिभाषित किया गया है।
  5. new कमांड इस अज्ञात सबक्लास के नो-तर्क कन्स्ट्रक्टर को कॉल करता है और परिणाम sac2 पर निर्दिष्ट करता है।

डिफ़ॉल्ट SomeClass की अनाम उपवर्ग में कोई तर्क निर्माता SomeClass की protected निर्माता की पहुंच है क्योंकि गुमनाम उपवर्ग SomeClass का वंशज है, इसलिए super() करने के लिए कॉल मान्य है। new कथन इस डिफ़ॉल्ट नो-तर्क कन्स्ट्रक्टर को कॉल करता है, जिसमें public दृश्यता है।

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