java - जावा में सार्वजनिक, संरक्षित, पैकेज-निजी और निजी के बीच क्या अंतर है?




private public (16)

जावा में, class और interface बनाने और विरासत से निपटने के दौरान, प्रत्येक एक्सेस संशोधक, अर्थात् डिफ़ॉल्ट (पैकेज निजी), public , protected और private , का उपयोग करने के लिए स्पष्ट नियम हैं?


निजी

  • तरीके, चर और रचनाकार

विधियों, चर और रचनाकार जिन्हें निजी घोषित किया जाता है केवल घोषित कक्षा के भीतर ही पहुंचा जा सकता है।

  • कक्षा और इंटरफ़ेस

निजी एक्सेस संशोधक सबसे प्रतिबंधित पहुंच स्तर है। कक्षा और इंटरफेस निजी नहीं हो सकते हैं।

ध्यान दें

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

संरक्षित

  • कक्षा और इंटरफ़ेस

संरक्षित एक्सेस संशोधक वर्ग और इंटरफेस पर लागू नहीं किया जा सकता है।

तरीके, फ़ील्ड को संरक्षित घोषित किया जा सकता है, हालांकि इंटरफ़ेस में विधियों और फ़ील्ड को सुरक्षित घोषित नहीं किया जा सकता है।

ध्यान दें

संरक्षित पहुंच उप-वर्ग को सहायक विधि या चर का उपयोग करने का मौका देती है, जबकि गैर-वर्गीकृत वर्ग को इसका उपयोग करने से रोकने से रोकती है।

जनता

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

इसलिए सार्वजनिक कक्षा के भीतर घोषित फ़ील्ड, विधियों, ब्लॉक को जावा यूनिवर्स से संबंधित किसी भी वर्ग से एक्सेस किया जा सकता है।

  • विभिन्न पैकेज

हालांकि यदि सार्वजनिक वर्ग जो हम एक्सेस करने का प्रयास कर रहे हैं वह एक अलग पैकेज में है, तो सार्वजनिक वर्ग को अभी भी आयात करने की आवश्यकता है।

वर्ग विरासत के कारण, कक्षा के सभी सार्वजनिक तरीकों और चर इसके उप-वर्गों द्वारा विरासत में प्राप्त होते हैं।

डिफ़ॉल्ट- कोई कीवर्ड नहीं:

डिफ़ॉल्ट पहुंच संशोधक का अर्थ है कि हम स्पष्ट रूप से कक्षा, फ़ील्ड, विधि इत्यादि के लिए एक एक्सेस संशोधक घोषित नहीं करते हैं।

  • एक ही पैकेज के भीतर

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

ध्यान दें

हम स्टेटिक फ़ील्ड्स को ओवरराइड नहीं कर सकते हैं। अगर आप इसे ओवरराइड करने का प्रयास करते हैं तो यह कोई त्रुटि नहीं दिखाता है लेकिन यह जो हम छोड़कर काम नहीं करता है।

संबंधित उत्तर

संदर्भ लिंक

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm


(चेतावनी: मैं जावा प्रोग्रामर नहीं हूं, मैं एक पर्ल प्रोग्रामर हूं। पर्ल के पास कोई औपचारिक सुरक्षा नहीं है, शायद यही कारण है कि मैं इस समस्या को बहुत अच्छी तरह समझता हूं :))

निजी

जैसा कि आप सोचेंगे, केवल जिस कक्षा में इसे घोषित किया गया है, वह इसे देख सकता है।

पैकेज निजी

केवल उस पैकेज द्वारा देखा और उपयोग किया जा सकता है जिसमें इसे घोषित किया गया था। जावा में यह डिफ़ॉल्ट है (जो कुछ गलती के रूप में देखते हैं)।

संरक्षित

पैकेज निजी + उपclasses या पैकेज सदस्य द्वारा देखा जा सकता है।

जनता

हर कोई इसे देख सकता है।

Published

मैं नियंत्रित कोड के बाहर दृश्यमान। (जावा वाक्यविन्यास नहीं होने पर, इस चर्चा के लिए यह महत्वपूर्ण है)।

सी ++ "दोस्त" नामक एक अतिरिक्त स्तर को परिभाषित करता है और जितना कम आप इसके बारे में जानते हैं उतना ही बेहतर।

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

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

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

व्यक्तिगत रूप से, मैं सिर्फ "निजी" और "सार्वजनिक" के साथ चिपक जाता हूं। कई ओओ भाषाओं में बस यही है। "संरक्षित" आसान हो सकता है, लेकिन यह वास्तव में एक धोखा है। एक बार इंटरफेस निजी से अधिक हो जाने पर यह आपके नियंत्रण से बाहर है और आपको उपयोग खोजने के लिए अन्य लोगों के कोड में जाना होगा।

यही वह जगह है जहां "प्रकाशित" का विचार आता है। एक इंटरफ़ेस बदलना (इसे पुन: सक्रिय करना) के लिए आवश्यक है कि आप इसका उपयोग कर रहे सभी कोड को ढूंढें और इसे भी बदलें। यदि इंटरफ़ेस निजी है, तो कोई समस्या नहीं है। यदि यह संरक्षित है तो आपको अपने सभी उप-वर्गों को ढूंढना होगा। यदि यह सार्वजनिक है तो आपको अपने कोड का उपयोग करने वाले सभी कोड मिलना होगा। कभी-कभी यह संभव है, उदाहरण के लिए यदि आप कॉरपोरेट कोड पर काम कर रहे हैं जो आंतरिक उपयोग के लिए है तो इससे कोई फर्क नहीं पड़ता कि कोई इंटरफ़ेस सार्वजनिक है या नहीं। आप कॉरपोरेट रिपोजिटरी से सभी कोड ले सकते हैं। लेकिन यदि कोई इंटरफ़ेस "प्रकाशित" होता है, यदि आपके नियंत्रण के बाहर इसका उपयोग करने वाला कोड है, तो आप को रोक दिया गया है। आपको उस इंटरफ़ेस या जोखिम तोड़ने वाले कोड का समर्थन करना होगा। यहां तक ​​कि संरक्षित इंटरफेस भी प्रकाशित माना जा सकता है (यही कारण है कि मैं संरक्षित से परेशान नहीं करता)।

कई भाषाओं में सार्वजनिक / संरक्षित / निजी की पदानुक्रमिक प्रकृति बहुत सीमित होती है और वास्तविकता के अनुरूप नहीं होती है। इसके अंत में एक विशेषता वर्ग की अवधारणा है, लेकिन यह एक और शो है।


आसान नियम सबकुछ निजी घोषित करने से शुरू करें। और फिर जनता की तरफ बढ़ती है क्योंकि जरूरतें उत्पन्न होती हैं और डिजाइन इसे वारंट करता है।

सदस्यों को उजागर करते समय खुद से पूछें कि क्या आप प्रतिनिधित्व विकल्प या अमूर्त विकल्प का पर्दाफाश कर रहे हैं। पहला ऐसा कुछ है जिसे आप टालना चाहते हैं क्योंकि यह इसके अवलोकन योग्य व्यवहार के बजाय वास्तविक प्रतिनिधित्व पर बहुत अधिक निर्भरताओं को पेश करेगा।

एक सामान्य नियम के रूप में मैं subclassing द्वारा विधि कार्यान्वयन ओवरराइडिंग से बचने की कोशिश; तर्क को पेंच करना बहुत आसान है। यदि आप इसे ओवरराइड करने का इरादा रखते हैं तो अमूर्त संरक्षित विधियों को घोषित करें।

साथ ही, जब आप रिफैक्टर करते हैं तो चीज़ों को तोड़ने से रोकने के लिए ओवरराइड करते समय @ ओवरराइड एनोटेशन का उपयोग करें।


कई स्तरों पर पहुंच प्रतिबंधित करने के लिए एक्सेस संशोधक हैं।

सार्वजनिक: यह मूल रूप से सरल है क्योंकि आप किसी भी वर्ग से पहुंच सकते हैं चाहे वह एक ही पैकेज में हो या नहीं।

यदि आप एक ही पैकेज में हैं तो पहुंचने के लिए आप सीधे पहुंच सकते हैं, लेकिन यदि आप किसी अन्य पैकेज में हैं तो आप कक्षा का ऑब्जेक्ट बना सकते हैं।

डिफ़ॉल्ट: यह पैकेज के किसी भी वर्ग से उसी पैकेज में पहुंच योग्य है।

आप तक पहुंचने के लिए कक्षा का एक वस्तु बना सकते हैं। लेकिन आप पैकेज के बाहर इस चर का उपयोग नहीं कर सकते हैं।

संरक्षित: आप किसी भी पैकेज में चर के साथ-साथ उप-वर्ग को किसी भी अन्य पैकेज में एक्सेस कर सकते हैं। तो मूल रूप से यह डिफ़ॉल्ट + विरासत व्यवहार है।

बेस क्लास में परिभाषित संरक्षित क्षेत्र तक पहुंचने के लिए आप बाल वर्ग की वस्तु बना सकते हैं।

निजी: यह एक ही कक्षा में उपयोग किया जा सकता है।

गैर स्थैतिक तरीकों में आप इस संदर्भ (कन्स्ट्रक्टरों में भी) के कारण सीधे पहुंच सकते हैं लेकिन कक्षा के ऑब्जेक्ट को बनाने के लिए आपको आवश्यक स्थिर तरीकों तक पहुंचने के लिए उपयोग कर सकते हैं।


तालिका का एक बेहतर संस्करण यहां दिया गया है। (मॉड्यूल के लिए कॉलम के साथ भविष्य सबूत।)

स्पष्टीकरण

  • एक निजी सदस्य ( i ) केवल उसी वर्ग के भीतर ही पहुंच योग्य है जैसा घोषित किया जाता है।

  • कोई एक्सेस संशोधक ( j ) वाला सदस्य केवल उसी पैकेज में कक्षाओं के भीतर पहुंच योग्य है।

  • एक संरक्षित सदस्य ( k ) एक ही पैकेज में सभी वर्गों के भीतर और अन्य पैकेजों में उप-वर्गों के भीतर पहुंच योग्य है।

  • एक सार्वजनिक सदस्य ( l ) सभी वर्गों के लिए सुलभ है (जब तक कि यह उस module में रहता है जो उस पैकेज को निर्यात नहीं करता है जिसमें इसे घोषित किया जाता है)।

कौन सा संशोधक चुनने के लिए?

एक्सेस संशोधक एक उपकरण है जो आपको गलती से encapsulation (*) को रोकने में मदद करने के लिए एक उपकरण है। अपने आप से पूछें कि क्या आप सदस्य को कक्षा, पैकेज, कक्षा पदानुक्रम के लिए आंतरिक या आंतरिक नहीं होने का इरादा रखते हैं, और तदनुसार पहुंच स्तर का चयन करें।

उदाहरण:

  • एक क्षेत्र long internalCounter काउंटर शायद यह निजी हो सकता है क्योंकि यह परिवर्तनीय और कार्यान्वयन विस्तार है।
  • एक वर्ग जिसे केवल फैक्ट्री क्लास (उसी पैकेज में) में तुरंत चालू किया जाना चाहिए, में पैकेज को प्रतिबंधित कन्स्ट्रक्टर होना चाहिए, क्योंकि इसे सीधे पैकेज के बाहर से कॉल करना संभव नहीं होना चाहिए।
  • void beforeRender() में एक हुक के रूप में प्रस्तुति और उपयोग करने से पहले सही नामक void beforeRender() विधि से पहले एक आंतरिक void beforeRender() संरक्षित किया जाना चाहिए।
  • जीयूआई कोड से बुलाया जाने वाला एक void saveGame(File dst) विधि सार्वजनिक होनी चाहिए।

(*) वास्तव में Encapsulation क्या है?


निर्धारित नियम के रूप में:

  • निजी : वर्ग का दायरा।
  • डिफ़ॉल्ट (या पैकेज-निजी ): पैकेज स्कोप।
  • संरक्षित : पैकेज स्कोप + बच्चा (पैकेज की तरह, लेकिन हम इसे विभिन्न पैकेजों से उपclass कर सकते हैं)। संरक्षित संशोधक हमेशा "अभिभावक-बच्चे" संबंध रखता है।
  • सार्वजनिक : हर जगह।

नतीजतन, अगर हम तीन अधिकारों में पहुंच को विभाजित करते हैं:

  • (डी) अप्रत्यक्ष (एक ही कक्षा के अंदर एक विधि से आह्वान)।
  • (आर) वरीयता (कक्षा के संदर्भ में, या "डॉट" वाक्यविन्यास के माध्यम से एक विधि का आह्वान करें)।
  • (I) शून्यता (उप classing के माध्यम से)।

तो हमारे पास यह सरल तालिका है:

+—-———————————————+————————————+———————————+
|                 |    Same    | Different |
|                 |   Package  | Packages  |
+—————————————————+————————————+———————————+
| private         |   D        |           |
+—————————————————+————————————+———————————+
| package-private |            |           |
| (no modifier)   |   D R I    |           |
+—————————————————+————————————+———————————+
| protected       |   D R I    |       I   |
+—————————————————+————————————+———————————+
| public          |   D R I    |    R  I   |
+—————————————————+————————————+———————————+

यह वास्तव में एक साधारण ग्रिड शो से थोड़ा अधिक जटिल है। ग्रिड आपको बताता है कि किसी एक्सेस की अनुमति है, लेकिन वास्तव में कोई पहुंच क्या है? इसके अलावा, पहुंच स्तर घोंसला वर्गों और विरासत जटिल तरीकों से बातचीत करते हैं।

"डिफ़ॉल्ट" पहुंच (किसी कीवर्ड की अनुपस्थिति द्वारा निर्दिष्ट) को package-private भी कहा जाता है। अपवाद: एक इंटरफेस में, कोई संशोधक सार्वजनिक पहुंच का मतलब नहीं है; जनता के अलावा संशोधक वर्जित हैं। एनम स्थिरांक हमेशा सार्वजनिक होते हैं।

सारांश

इस एक्सेस विनिर्देशक के साथ किसी सदस्य की पहुंच है?

  • सदस्य private : केवल तभी सदस्य को कोड के रूप में उसी वर्ग के भीतर परिभाषित किया जाता है।
  • सदस्य पैकेज निजी है: केवल अगर कॉलिंग कोड सदस्य के तत्काल संलग्न पैकेज में है।
  • सदस्य protected : वही पैकेज, या यदि सदस्य को कॉलिंग कोड वाले वर्ग के सुपरक्लास में परिभाषित किया गया है।
  • सदस्य public : हां।

क्या एक्सेस विनिर्देशक लागू होते हैं

स्थानीय चर और औपचारिक पैरामीटर एक्सेस विनिर्देश नहीं ले सकते हैं। चूंकि वे स्कोपिंग नियमों के अनुसार बाहर के लिए स्वाभाविक रूप से पहुंच योग्य नहीं हैं, इसलिए वे प्रभावी रूप से निजी हैं।

शीर्ष दायरे में कक्षाओं के लिए, केवल public और पैकेज-निजी की अनुमति है। यह डिज़ाइन पसंद संभवत: पैकेज स्तर पर protected और private अनावश्यक होगा (पैकेजों की कोई विरासत नहीं है)।

वर्ग के सदस्यों (कन्स्ट्रक्टर, विधियों और स्थैतिक सदस्य कार्यों, नेस्टेड कक्षाओं) पर सभी एक्सेस विनिर्देशक संभव हैं।

संबंधित: जावा क्लास अभिगम्यता

क्रम

एक्सेस विनिर्देशों का सख्ती से आदेश दिया जा सकता है

सार्वजनिक> संरक्षित> पैकेज-निजी> निजी

जिसका अर्थ है कि public सबसे अधिक पहुंच प्रदान करता है, कम से कम private । किसी निजी सदस्य पर संभव कोई भी संदर्भ पैकेज-निजी सदस्य के लिए भी मान्य है; किसी पैकेज-निजी सदस्य का कोई संदर्भ संरक्षित सदस्य पर मान्य है, और इसी तरह। (एक ही पैकेज में अन्य वर्गों के लिए संरक्षित सदस्यों तक पहुंच देना गलती माना जाता था।)

टिप्पणियाँ

  • एक वर्ग की विधियों को उसी वर्ग की अन्य वस्तुओं के निजी सदस्यों तक पहुंचने की अनुमति है। अधिक सटीक रूप से, कक्षा सी का एक तरीका सी के किसी भी उप-वर्ग के ऑब्जेक्ट्स पर सी के निजी सदस्यों तक पहुंच सकता है। जावा केवल उदाहरण के द्वारा प्रतिबंधित प्रतिबंधित करने का समर्थन नहीं करता है। (स्कैला के साथ तुलना करें, जो इसे private[this] का उपयोग करके समर्थन देता है।)
  • ऑब्जेक्ट बनाने के लिए आपको किसी कन्स्ट्रक्टर तक पहुंच की आवश्यकता है। इस प्रकार यदि सभी रचनाकार निजी हैं, तो कक्षा केवल कक्षा के भीतर रहने वाले कोड द्वारा बनाई जा सकती है (आमतौर पर स्थैतिक फैक्ट्री विधियों या स्थैतिक चर प्रारंभकर्ता)। इसी तरह पैकेज-निजी या संरक्षित रचनाकारों के लिए।
    • केवल निजी कन्स्ट्रक्टर होने का मतलब यह भी है कि क्लास को बाहरी रूप से उप-वर्गीकृत नहीं किया जा सकता है, क्योंकि जावा को सबक्लास के रचनाकारों को निहित या स्पष्ट रूप से सुपरक्लास कन्स्ट्रक्टर को कॉल करने की आवश्यकता होती है। (हालांकि, इसमें एक घोंसला वाली कक्षा हो सकती है जो इसे उपclasses।)

आंतरिक कक्षाएं

आपको भीतरी कक्षाओं जैसे नेस्टेड स्कॉप्स पर विचार करना होगा। जटिलता का एक उदाहरण यह है कि आंतरिक वर्गों के सदस्य होते हैं, जो स्वयं एक्सेस संशोधक ले सकते हैं। तो आप एक सार्वजनिक सदस्य के साथ एक निजी आंतरिक कक्षा हो सकती है; क्या सदस्य का उपयोग किया जा सकता है? (नीचे देखें।) सामान्य नियम यह है कि आप प्रत्येक स्तर तक पहुंच सकते हैं या नहीं, यह देखने के लिए बार-बार सोचें।

हालांकि, यह काफी जटिल है, और पूर्ण विवरण के लिए, जावा भाषा विशिष्टता से परामर्श लें । (हां, अतीत में कंपाइलर कीड़े रहे हैं।)

इन बातचीत के स्वाद के लिए, इस उदाहरण पर विचार करें। निजी आंतरिक कक्षाओं को "रिसाव" करना संभव है; यह आमतौर पर एक चेतावनी है:

class Test {
    public static void main(final String ... args) {
        System.out.println(Example.leakPrivateClass()); // OK
        Example.leakPrivateClass().secretMethod(); // error
    }
}

class Example {
    private static class NestedClass {
        public void secretMethod() {
            System.out.println("Hello");
        }
    }
    public static NestedClass leakPrivateClass() {
        return new NestedClass();
    }
}

कंपाइलर आउटपुट:

Test.java:4: secretMethod() in Example.NestedClass is defined in an inaccessible class or interface
        Example.leakPrivateClass().secretMethod(); // error
                                  ^
1 error

कुछ संबंधित प्रश्न:


आधिकारिक ट्यूटोरियल आपके लिए कुछ उपयोग हो सकता है।

            │ Class │ Package │ Subclass │ Subclass │ World
            │       │         │(same pkg)│(diff pkg)│ 
────────────┼───────┼─────────┼──────────┼──────────┼────────
public      │   +   │    +    │    +     │     +    │   +     
────────────┼───────┼─────────┼──────────┼──────────┼────────
protected   │   +   │    +    │    +     │     +    │         
────────────┼───────┼─────────┼──────────┼──────────┼────────
no modifier │   +   │    +    │    +     │          │    
────────────┼───────┼─────────┼──────────┼──────────┼────────
private     │   +   │         │          │          │    

+ : accessible
blank : not accessible

जावा में एक्सेस संशोधक।

जावा एक्सेस मॉडिफायर का उपयोग जावा में एक्सेस कंट्रोल प्रदान करने के लिए किया जाता है।

1. डिफ़ॉल्ट:

केवल उसी पैकेज में कक्षाओं तक पहुंच योग्य।

उदाहरण के लिए,

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

यह पहुंच सार्वजनिक और संरक्षित से अधिक प्रतिबंधित है, लेकिन निजी से कम प्रतिबंधित है।

2. सार्वजनिक

कहीं से भी पहुंचा जा सकता है। (वैश्विक पहुंच)

उदाहरण के लिए,

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

आउटपुट: नमस्ते

3. निजी

केवल उसी कक्षा के भीतर सुलभ।

यदि आप किसी अन्य वर्ग में निजी सदस्यों तक पहुंचने का प्रयास करते हैं तो संकलन त्रुटि फेंक देंगे। उदाहरण के लिए,

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4. संरक्षित

केवल उसी पैकेज और उप-वर्गों में कक्षाओं तक पहुंच योग्य

उदाहरण के लिए,

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

आउटपुट: हैलो


निजी : केवल कक्षा तक सीमित पहुंच

डिफ़ॉल्ट (कोई संशोधक नहीं) : कक्षा और पैकेज तक सीमित पहुंच

संरक्षित : कक्षा, पैकेज और उप-वर्गों तक सीमित पहुंच (अंदर और बाहर पैकेज दोनों)

सार्वजनिक : वर्ग, पैकेज (सभी), और उप-वर्गों के लिए सुलभ ... संक्षेप में, हर जगह।


कई बार मुझे एहसास हुआ है कि किसी भी भाषा की बुनियादी अवधारणाओं को याद रखना वास्तविक दुनिया के अनुरूप बनाकर संभव हो सकता है। जावा में एक्सेस संशोधक को समझने के लिए मेरा सादृश्य यहां दिया गया है:

आइए मान लीजिए कि आप एक विश्वविद्यालय में छात्र हैं और आपके पास एक दोस्त है जो सप्ताहांत में आपसे मिलने आ रहा है। मान लीजिए कि परिसर के बीच में विश्वविद्यालय के संस्थापक की एक बड़ी मूर्ति मौजूद है।

  • जब आप उसे परिसर में लाते हैं, तो पहली बात यह है कि आप और आपके मित्र को यह मूर्ति है। इसका मतलब है कि परिसर में चलने वाला कोई भी व्यक्ति विश्वविद्यालय की अनुमति के बिना मूर्ति को देख सकता है। यह मूर्ति को सार्वजनिक के रूप में बनाता है ।

  • इसके बाद, आप अपने दोस्त को अपने छात्रावास में ले जाना चाहते हैं, लेकिन इसके लिए आपको उसे आगंतुक के रूप में पंजीकृत करने की आवश्यकता है। इसका मतलब है कि परिसर में विभिन्न इमारतों में प्रवेश करने के लिए उसे एक एक्सेस पास (जो आपके जैसा ही है) प्राप्त होता है। यह संरक्षित के रूप में अपना एक्सेस कार्ड बना देगा ।

  • आपका मित्र कैंपस वाईफाई में लॉगिन करना चाहता है लेकिन ऐसा करने के लिए कोई प्रमाण-पत्र नहीं है। ऑनलाइन प्राप्त करने का एकमात्र तरीका यह है कि यदि आप उसके साथ अपना लॉगिन साझा करते हैं। (याद रखें, विश्वविद्यालय में जाने वाले प्रत्येक छात्र के पास इन लॉगिन प्रमाण-पत्र भी हैं)। इससे आपके लॉगिन प्रमाण-पत्र कोई संशोधक नहीं होंगे

  • अंत में, आपका मित्र वेबसाइट पर पोस्ट किए गए सेमेस्टर के लिए अपनी प्रगति रिपोर्ट पढ़ना चाहता है। हालांकि, कैंपस वेबसाइट के इस खंड तक पहुंचने के लिए प्रत्येक छात्र का अपना व्यक्तिगत लॉगिन होता है। यह इन प्रमाण-पत्रों को निजी के रूप में बनाएगा ।

उम्मीद है की यह मदद करेगा!


जब आप एक्सेस संशोधक के बारे में सोच रहे हैं तो बस इस तरह से सोचें ( चर और विधियों दोनों पर लागू होता है ):

public-> हर जगह से सुलभ
private-> केवल उसी कक्षा के भीतर सुलभ जहां इसे घोषित किया जाता है

अब भ्रम की स्थिति पैदा होती है जब यह करने के लिए आता defaultहै औरprotected

default-> कोई एक्सेस संशोधक कीवर्ड मौजूद नहीं है। इसका मतलब है कि यह कक्षा के पैकेज के भीतर सख्ती से उपलब्ध है। उस पैकेज के बाहर कहीं भी इसका उपयोग नहीं किया जा सकता है।

protected-> defaultउसी पैकेज कक्षाओं के मुकाबले थोड़ा और कम कठोर यह इसे घोषित किए गए पैकेज के बाहर उप वर्गों द्वारा एक्सेस किया जा सकता है ।


नोट: यह स्वीकार्य उत्तर के लिए सिर्फ एक पूरक है

यह जावा एक्सेस संशोधक से संबंधित है ।

से जावा पहुँच संशोधक :

जावा एक्सेस संशोधक निर्दिष्ट करता है कि कौन से वर्ग किसी दिए गए वर्ग और उसके फ़ील्ड, कन्स्ट्रक्टर और विधियों तक पहुंच सकते हैं। एक्सेस संशोधक को कक्षा, इसके रचनाकारों, क्षेत्रों और विधियों के लिए अलग से निर्दिष्ट किया जा सकता है। जावा एक्सेस संशोधक को कभी-कभी दैनिक पहुंच में जावा एक्सेस विनिर्देशक के रूप में भी संदर्भित किया जाता है, लेकिन सही नाम जावा एक्सेस संशोधक है। कक्षाएं, फ़ील्ड, कन्स्ट्रक्टर और विधियों में चार अलग-अलग जावा एक्सेस संशोधक हो सकते हैं:

  • सामग्री सूचीबद्ध करें
  • निजी
  • डिफ़ॉल्ट (पैकेज)
  • संरक्षित
  • जनता

कक्षा ट्यूटोरियल के सदस्यों तक पहुंच नियंत्रित करने से :

एक्सेस लेवल संशोधक यह निर्धारित करते हैं कि अन्य वर्ग किसी विशेष फ़ील्ड का उपयोग कर सकते हैं या किसी विशेष विधि का आह्वान कर सकते हैं। अभिगम नियंत्रण के दो स्तर हैं:

  • शीर्ष स्तर पर सार्वजनिक, या पैकेज-निजी (कोई स्पष्ट संशोधक नहीं)।
  • सदस्य स्तर पर सार्वजनिक, निजी, संरक्षित, या पैकेज-निजी (कोई स्पष्ट संशोधक नहीं)।

एक वर्ग को संशोधक जनता के साथ घोषित किया जा सकता है, जिस स्थिति में कक्षा हर जगह सभी वर्गों के लिए दृश्यमान है। यदि किसी वर्ग में कोई संशोधक नहीं है (डिफ़ॉल्ट, जिसे पैकेज-निजी भी कहा जाता है), यह केवल अपने ही पैकेज में दिखाई देता है

निम्न तालिका प्रत्येक संशोधक द्वारा अनुमत सदस्यों तक पहुंच दिखाती है।

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ Modifier    ║ Class ║ Package ║ Subclass ║ World ║
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
║ public      ║ Y     ║ Y       ║ Y        ║ Y     ║
║ protected   ║ Y     ║ Y       ║ Y        ║ N     ║
║ no modifier ║ Y     ║ Y       ║ N        ║ N     ║
║ private     ║ Y     ║ N       ║ N        ║ N     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

पहला डेटा कॉलम इंगित करता है कि कक्षा के पास पहुंच स्तर द्वारा परिभाषित सदस्य तक पहुंच है या नहीं। जैसा कि आप देख सकते हैं, एक वर्ग के पास हमेशा अपने सदस्यों तक पहुंच होती है। दूसरा कॉलम इंगित करता है कि कक्षा के समान पैकेज में कक्षाएं (उनके माता-पिता के बावजूद) के पास सदस्य तक पहुंच है। तीसरा कॉलम इंगित करता है कि इस पैकेज के बाहर घोषित कक्षा के उप-वर्गों के पास सदस्य तक पहुंच है या नहीं। चौथा स्तंभ इंगित करता है कि सभी वर्गों के पास सदस्य तक पहुंच है या नहीं।

एक्सेस स्तर आपको दो तरीकों से प्रभावित करते हैं। सबसे पहले, जब आप किसी अन्य स्रोत से आने वाले वर्गों का उपयोग करते हैं, जैसे कि जावा प्लेटफ़ॉर्म में कक्षाएं, एक्सेस स्तर निर्धारित करते हैं कि उन वर्गों के कौन से सदस्य आपकी कक्षाएं उपयोग कर सकते हैं। दूसरा, जब आप कक्षा लिखते हैं, तो आपको यह तय करना होगा कि प्रत्येक सदस्य चर का उपयोग स्तर और आपकी कक्षा में प्रत्येक विधि के पास क्या होना चाहिए।


पैकेज के लिए दृश्यमान। डिफ़ॉल्ट। कोई संशोधक की आवश्यकता नहीं है।

केवल कक्षा ( निजी ) के लिए दृश्यमान ।

दुनिया के लिए दृश्यमान ( सार्वजनिक )।

पैकेज और सभी उप-वर्गों ( संरक्षित ) के लिए दृश्यमान ।

चर या विधियों को बिना किसी संशोधक के घोषित किया जा सकता है जिसे बुलाया जाता है। डिफ़ॉल्ट उदाहरण:

String name = "john";

public int age(){
    return age;
}

निजी पहुंच संशोधक - निजी:

विधियों, चर और रचनाकार जिन्हें निजी घोषित किया जाता है केवल घोषित कक्षा के भीतर ही पहुंचा जा सकता है। निजी एक्सेस संशोधक सबसे प्रतिबंधित पहुंच स्तर है। कक्षा और इंटरफेस निजी नहीं हो सकते हैं।

कक्षा में सार्वजनिक गेटर विधियां मौजूद होने पर वेरिएबल्स को निजी घोषित किया जा सकता है।

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

उदाहरण:

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

सार्वजनिक पहुंच संशोधक - सार्वजनिक:

एक वर्ग, विधि, कन्स्ट्रक्टर, इंटरफ़ेस इत्यादि घोषित लोगों को किसी अन्य वर्ग से एक्सेस किया जा सकता है। इसलिए सार्वजनिक वर्ग के भीतर घोषित फ़ील्ड, विधियों, ब्लॉक को जावा ब्रह्मांड से संबंधित किसी भी वर्ग से एक्सेस किया जा सकता है।

हालांकि, यदि सार्वजनिक वर्ग जो हम एक्सेस करने का प्रयास कर रहे हैं वह एक अलग पैकेज में है, तो सार्वजनिक वर्ग को अभी भी आयात करने की आवश्यकता है।

वर्ग विरासत के कारण, कक्षा के सभी सार्वजनिक तरीकों और चर इसके उप-वर्गों द्वारा विरासत में प्राप्त होते हैं।

उदाहरण:

public void cal(){

}

संरक्षित एक्सेस संशोधक - संरक्षित:

एक सुपरक्लास में संरक्षित घोषित चर, विधियों और रचनाकारों को केवल दूसरे पैकेज में या संरक्षित सदस्यों के वर्ग के पैकेज के भीतर किसी वर्ग में उप-वर्गों द्वारा उपयोग किया जा सकता है।

संरक्षित एक्सेस संशोधक वर्ग और इंटरफेस पर लागू नहीं किया जा सकता है। तरीके, फ़ील्ड को संरक्षित घोषित किया जा सकता है, हालांकि इंटरफ़ेस में विधियों और फ़ील्ड को सुरक्षित घोषित नहीं किया जा सकता है।

संरक्षित पहुंच उप-वर्ग को सहायक विधि या चर का उपयोग करने का मौका देती है, जबकि गैर-वर्गीकृत वर्ग को इसका उपयोग करने से रोकने से रोकती है।

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}

यह सब encapsulation के बारे में है (या जो फिलिप्स ने कहा, कम से कम ज्ञान )।

सबसे प्रतिबंधित (निजी) से शुरू करें और देखें कि आपको बाद में कम प्रतिबंधक संशोधक की आवश्यकता है या नहीं।

हम सभी निजी, सार्वजनिक, जैसे विधि और सदस्य संशोधक का उपयोग करते हैं ... लेकिन एक चीज बहुत कम डेवलपर कोड को तार्किक रूप से व्यवस्थित करने के लिए पैकेज का उपयोग करते हैं ।

उदाहरण के लिए: आप 'सुरक्षा' पैकेज में संवेदनशील सुरक्षा विधियां डाल सकते हैं। फिर एक सार्वजनिक वर्ग डालें जो इस पैकेज में कुछ सुरक्षा संबंधित कोड तक पहुंचता है लेकिन अन्य सुरक्षा वर्ग पैकेज को निजी रखता है । इस प्रकार अन्य डेवलपर केवल इस पैकेज के बाहर से सार्वजनिक रूप से उपलब्ध कक्षा का उपयोग करने में सक्षम होंगे (जब तक वे संशोधक को परिवर्तित नहीं करते)। यह एक सुरक्षा सुविधा नहीं है, लेकिन उपयोग का मार्गदर्शन करेगा ।

Outside world -> Package (SecurityEntryClass ---> Package private classes)

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

यदि इसके विपरीत आप सब कुछ जनता के रूप में सेट करते हैं तो यह स्पष्ट नहीं होगा कि किस तक पहुंचाया जाना चाहिए या नहीं किया जाना चाहिए, जिससे बहुत सारे जावाडोक लिख सकते हैं (जो संकलक के माध्यम से कुछ भी लागू नहीं करता है ...)।


                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |       ✔       |     ✔     |       ✔       |   ✔   
————————————————+———————————————+———————————+———————————————+———————
protected       |       ✔       |     ✔     |       ✔       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |       ✔       |     ✔     |       ✘       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
private         |       ✔       |     ✘     |       ✘       |   ✘    




access-modifiers