दिलचस्प पोस्ट
एक एल्गोरिथ्म के कारण ओ (लॉग लॉग एन) जटिलता का कारण होगा? मैं कैसे देख सकता हूं कि मेरी प्रतिक्रियाशील एक्सटेंशन क्वेरी क्या कर रही है? मैं उपयोगकर्ताओं को दो बार एक बटन पर क्लिक करने से कैसे रोकूं? रिक्त समाप्त स्ट्रिंग के लिए तर्क क्या है? JavaMail API को iMail – java.net.SocketException: अनुमति अस्वीकृत: कनेक्ट करें Google मानचित्र एपीआई – पते के समन्वय प्राप्त करें पीएचपी तिथि () और स्ट्रॉटोम () 31 महीने के गलत महीनों में वापस आती है असाइनमेंट के माध्यम से पायथन कॉपी? सी ++ में स्ट्रक्चर्ड अपवाद (एसईएच) के बारे में मुझे क्या पता होना चाहिए? आपके जावास्क्रिप्ट कोड के दस्तावेज के लिए कौन से विकल्प उपलब्ध हैं? क्या पीबीकेडीएफ 2 का एक एसक्यूएल कार्यान्वयन है? स्कैनफ़ हर दूसरे को छोड़ देता है जबकि सी में लूप होता है आईफोन रिस्ट क्लाइंट ऐप्पल एलएलवीएम 6.0 त्रुटि: क्लैग असफल कोड -1 के साथ विफल हुआ एंड्रॉइड: Google सर्वर का उपयोग किए बिना भाषण मान्यता

जावा के संरक्षित संशोधक को समझना

मेरे पास क्लास 1 में ए नामक एक क्लास है और दूसरा क्लास जिसे पैकेज 2 में सी कहते हैं। कक्षा सी कक्षा ए विस्तारता है

ए में एक उदाहरण चर है जो इस तरह घोषित किया गया है:

protected int protectedInt = 1; 

यहां कक्षा ए के लिए कोड है

 package package1; public class A { public int publicInt = 1; private int privateInt = 1; int defaultInt = 1; protected int protectedInt = 1; } 

और यहां वर्ग C के लिए कोड है:

 package package2; import package1.A; public class C extends A{ public void go(){ //remember the import statement A a = new A(); System.out.println(a.publicInt); System.out.println(a.protectedInt); } } 

Eclipse सीजीओ () में अंतिम पंक्ति को रेखांकित करता है और कहते हैं "ए संरक्षित" दिखाई नहीं दे रहा है। ऐसा लगता है कि यह "संरक्षित" कीवर्ड की परिभाषा के साथ संघर्ष करता है, जो ओरेकल दस्तावेज़ों में दिया गया है।

संरक्षित संशोधक निर्दिष्ट करता है कि सदस्य को अपने पैकेज (केवल पैकेज-निजी के साथ) में ही पहुंचा जा सकता है, इसके अतिरिक्त, किसी अन्य पैकेज में इसके वर्ग के उप-वर्ग द्वारा।

यहाँ क्या चल रहा है?

Solutions Collecting From Web of "जावा के संरक्षित संशोधक को समझना"

यहाँ क्या चल रहा है?

आपने protected संरक्षणार्थ का अर्थ गलत समझा है आप C भीतर से घोषित संरक्षित सदस्यों तक पहुंच सकते हैं, लेकिन केवल C उप-वर्गों या C उदाहरणों के लिए। संरक्षित पहुंच के विवरण के लिए जेएलएस के खंड 6.6.2 देखें। विशेष रूप से:

आज्ञा देना क्लास होना चाहिए जिसमें एक संरक्षित सदस्य घोषित किया गया है। प्रवेश की अनुमति केवल सी के उप-वर्ग एस के शरीर के भीतर है।

इसके अतिरिक्त, यदि आईडी एक उदाहरण क्षेत्र या उदाहरण विधि को दर्शाता है, तो:

  • […]

  • अगर प्रवेश फ़ील्ड ऐक्सेस एक्सप्रेशन ई.आईड द्वारा होता है, जहां ई एक प्राथमिक अभिव्यक्ति है, या एक विधि अभिविन्यास अभिव्यक्ति ई.आईडी (..) से, जहां ई एक प्राथमिक अभिव्यक्ति है, तब प्रवेश की अनुमति है अगर और केवल अगर ई का प्रकार एस है या एस का उप-वर्ग है

(जोर मेरा।)

तो यह कोड ठीक होगा:

 C c = new C(); System.out.println(c.publicInt); System.out.println(c.protectedInt); 

चूंकि C का उत्तराधिकारी है, C सीधे A तरह से protected चर का उपयोग कर सकते हैं

 public class C extends A{ public void go(){ System.out.println(protectedInt); } } 

आपके कोड के अनुसार, आप A एक उदाहरण का निर्माण कर रहे हैं और उस आवृत्ति के माध्यम से protected चर तक पहुंच रहे हैं, जो जावा के नियम का उल्लंघन करता है – एक संरक्षित चर पैकेज के बाहर दिखाई नहीं देता है

  public void go(){ //remember the import statement A a = new A(); System.out.println(a.publicInt); System.out.println(a.protectedInt); } 

जब आप A a = new A(); और a.protectedInt आप के संरक्षित सदस्य का उपयोग करने की कोशिश कर रहा है जो कि जावा मानक के अनुसार गैरकानूनी है

इसके बजाय आप ऐसा कर सकते हैं। this.protectedInt सीधे

सुरक्षा 2 कक्षा के भीतर सुरक्षा वर्ग को इन्स्टिट करने की आवश्यकता नहीं है। आप सुरक्षा वर्ग को तुरंत बिना सुरक्षित चर पर कॉल कर सकते हैं। क्योंकि संरक्षण 2 वर्ग सुरक्षा वर्ग को बढ़ाता है तो परिवर्तनशील स्वचालित रूप से उपवर्ग द्वारा विरासत में मिला है।

नीचे कोड के साथ प्रयास करें:

 public class Protection2 extends Protection{ Protection2() {System.out.println("n_pro = " +n_pro); }} 

उसी पैकेज के भीतर जहां संरक्षित सदस्य घोषित किया गया है, प्रवेश की अनुमति है:

 package package1; public class C extends A{ public void go(){ A a = new A(); System.out.println(a.protectedInt); // got printed C c = new C(); System.out.println(c.protectedInt); // got printed as well } } 

उस पैकेज के बाहर जहां संरक्षित सदस्य घोषित किया जाता है, प्रवेश की अनुमति दी जाती है और केवल अगर उस ऑब्जेक्ट के कार्यान्वयन के लिए जिम्मेदार कोड द्वारा। इस मामले में, सी उस ऑब्जेक्ट के कार्यान्वयन के लिए उत्तरदायी है, इसलिए यह संरक्षित सुरक्षित हो सकता है।

 package package2; public class C extends A{ public void go(){ A a = new A(); System.out.println(a.protectedInt); // compiler complains C c = new C(); System.out.println(c.protectedInt); // got printed } }