2014-04-15 6 views
16

जब मैं public विधि के साथ protected विधि को ओवरराइड करता हूं तो जावा कंपाइलर शिकायत नहीं करता है। वास्तव में यहाँ क्या हो रहा है? क्या यह मूल विधि को ओवरराइड या छुपा रहा है क्योंकि मूल विधि में कम दृश्यता है?मैं सार्वजनिक विधि के साथ संरक्षित विधि को ओवरराइड क्यों कर सकता हूं?

उत्तर

22

एक उप-वर्ग हमेशा एक्सेस संशोधक को विस्तृत कर सकता है, क्योंकि यह अभी भी सुपर-क्लास के लिए एक वैध प्रतिस्थापन है। Requirements in Overriding and Hiding के बारे में जावा विनिर्देश से:

पहुँच संशोधक (§6.6) एक अधिभावी की या विधि छुपा, ओवरराइड या छिपा विधि के रूप में कम से कम के रूप में ज्यादा एक्सेस प्रदान करना होगा इस प्रकार है:

  • हैं ओवरराइड या छुपी विधि सार्वजनिक है, तो ओवरराइडिंग या छिपाने की विधि सार्वजनिक होनी चाहिए; अन्यथा, एक संकलन-समय त्रुटि होती है।
  • यदि ओवरराइड या छुपी विधि सुरक्षित है, तो ओवरराइडिंग या छिपाने की विधि को संरक्षित या सार्वजनिक किया जाना चाहिए; अन्यथा, एक संकलन-समय त्रुटि होती है।
  • यदि ओवरराइड या छुपी विधि में डिफ़ॉल्ट (पैकेज) पहुंच है, तो ओवरराइडिंग या छिपाने की विधि निजी नहीं होनी चाहिए; अन्यथा, एक संकलन-समय त्रुटि होती है।
2

एक बाहरी वर्ग की दृष्टि से, सार्वजनिक विधि के बाद से बाहरी वर्ग वैसे भी संरक्षित विधि का उपयोग नहीं कर सकता है, बस एक नई विधि, नहीं एक अधिभावी तरीका है।

दूसरी तरफ, दृश्यता को कम करने की अनुमति नहीं है क्योंकि बाहरी वर्ग हमेशा उप-वर्ग के किसी ऑब्जेक्ट को संदर्भित करने के लिए सुपर-क्लास के प्रकार का संदर्भ उपयोग कर सकता है और उसी विधि को कॉल कर सकता है।

0

दृश्यता केवल बाहरी पहुंच को प्रभावित करती है। public विधि होने के नाते कोई बाहरी वर्ग इसे कॉल कर सकता है।

ओवरराइडिंग विधि का एक्सेस स्तर मूल विधि की दृश्यता को प्रभावित नहीं करता है। ओवरराइड के बाद, किसी भी एक्सेस स्तर के साथ, मूल विधि को केवल उप-वर्ग में super पर कॉल करके एक्सेस किया जा सकता है।

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