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


3171

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


161
privateपैकेज के भीतर अन्य वर्गों से छुपाता है। publicपैकेज के बाहर कक्षाओं के लिए उजागर करता है। protectedका एक संस्करण है publicकेवल उपवर्गों तक ही सीमित।
9

87
@ टेनेनरिशिन - नहीं; जावा में C ++ के विपरीत, protectedपूरे पैकेज से विधि को भी सुलभ बनाता है। जावा के विज़िबिलिटी मॉडल में यह मूर्खता लक्ष्य को तोड़ देती है protected
निकोलस बारबुल्स्को

35
@ निकोलस यह पूरे पैकेज से, बिना या इसके साथ सुलभ है protected। एक्सेस मॉडिफ़ायर के रूप में , protectedपैकेज के बाहर उपवर्गों को उजागर करना है।
मार्सफुल

15
@tennenrishin - ठीक है, यही निकोलस ने कहा है ... और आप अभी इसे दोहरा रहे हैं। आपने मूल रूप से जो कहा था, वह था protected- और मैं बोली - 'केवल उपवर्गों तक सीमित जनता का एक संस्करण है' जो आपके स्वयं के प्रवेश द्वारा सच नहीं है क्योंकि संरक्षित भी पूरे पैकेज (एर्गो) के माध्यम से पहुंच की अनुमति देता है, यह उपवर्गों तक पहुंच को प्रतिबंधित नहीं करता है । )
luis.espinal

10
मैं निकोलस से भी सहमत हूं कि जावा में संरक्षित एक्सेस मोड मुहावरेदार है। क्या हुआ कि जावा ने क्षैतिज (जाली) और ऊर्ध्वाधर पहुंच प्रतिबंध क्वालीफायर को जब्त कर लिया। डिफ़ॉल्ट गुंजाइश एक क्षैतिज / जाली प्रतिबंध है जिसमें जाली पैकेज है। सार्वजनिक एक और क्षैतिज प्रतिबंध है जहां जाली पूरी दुनिया है। निजी और (C ++) संरक्षित ऊर्ध्वाधर हैं। यह बेहतर होता अगर हम क्रॉस-कट एक्सेस करते, कहते, protected-packageदुर्लभ मामलों के लिए जहां हमें वास्तव में इसकी आवश्यकता थी, protectedसंरक्षित के C ++ संस्करण के बराबर होना चाहिए।
luis.espinal

जवाबों:


5636

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

______________________________________________________________
| │ कक्षा │ पैकेज cl उपवर्ग ass उपवर्ग। विश्व |
| │ │ │ (वही pkg) diff (diff pkg) │ |
| ───────────┼───────┼─────────┼──────────┼──────── ──┼──────── |
| सार्वजनिक │ + │ + │ + │ + | + | 
| ───────────┼───────┼─────────┼──────────┼──────── ──┼──────── |
| संरक्षित │ + │ + │ + │ +। | 
| ───────────┼───────┼─────────┼──────────┼──────── ──┼──────── |
| कोई संशोधक नहीं + │ + │ + │। | 
| ───────────┼───────┼─────────┼──────────┼──────── ──┼──────── |
| निजी │ + │ │ │। |
| ___________ | _______ | _________ | __________ | __________ | ________ |
 +: सुलभ रिक्त: सुलभ नहीं

5
ऊपर दी गई तालिका गलत है, यहां तक ​​कि privateसदस्यों को किसी भी वर्ग / स्थिर विधि द्वारा उसी स्रोत-फ़ाइल में देखा / उपयोग किया जा सकता है।
उसगी मियामोतो

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

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

3
उदाहरण के लिए, अगर मेरे पास है MyClassऔर मैं कर रहा हूं तो मेरे पास AnotherClass extends MyClassसभी संरक्षित और सार्वजनिक तरीकों और संपत्तियों तक पहुंच होगी AnotherClass। अगर मैं ऐसा करने MyClass myClass = new MyClass();में AnotherClassकहीं - चलो का कहना है कि निर्माता - अगर यह एक अलग पैकेज में है मैं केवल सार्वजनिक तरीकों के लिए उपयोग होगा। ध्यान दें कि अगर मैं ऐसा = new MyClass() { @Override protected void protectedMethod() { //some logic } };करता हूं तो मुझे लगता है कि मैं संरक्षित तरीकों का उपयोग कर सकता हूं, लेकिन इस तरह का एक ही इसका विस्तार किया जा सकता है, लेकिन इसके बजाय इनलाइन।
adprocas

3
दुर्भाग्य से, यह उत्तर एक सकल निरीक्षण है। वास्तविकता थोड़ी अधिक जटिल है, खासकर जब आप विचार करते हैं protected(जो कि वास्तव में पूरी तरह से समझने के लिए काफी मुश्किल पहुंच संशोधक है - ज्यादातर लोग जो सोचते हैं कि वे जानते हैं कि protectedवास्तव में क्या मतलब नहीं है)। साथ ही, जैसा कि बोहेमियन ने कहा, यह सवाल का जवाब नहीं देता है - यह कहता है कि प्रत्येक एक्सेस संशोधक का उपयोग कब करना है इसके बारे में कुछ भी नहीं है । मेरी राय में, यह उत्तर काफी खराब नहीं है, लेकिन करीब है। लेकिन 4000 से अधिक upvotes? ये कैसे हुआ?
दाऊद इब्न करीम

483

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

निजी

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

पैकेज निजी

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

संरक्षित

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

जनता

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

प्रकाशित

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

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

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

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

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

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

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

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


26
दोस्तों -> "जितना कम आप इसके बारे में बेहतर जानते हैं" ---> यह चयनात्मक दृश्यता देता है, जो अभी भी पैकेज गोपनीयता से बेहतर है। C ++ में, इसके उपयोग हैं, क्योंकि सभी फ़ंक्शन सदस्य फ़ंक्शन नहीं हो सकते हैं, और मित्र public'ing से बेहतर हैं। निश्चित रूप से बुरे दिमागों द्वारा दुरुपयोग का खतरा है।
सेबेस्टियन मच

30
यह भी ध्यान दिया जाना चाहिए कि सी ++ में "संरक्षित" का एक अलग अर्थ है - एक संरक्षित तरीका प्रभावी रूप से निजी है, लेकिन फिर भी एक विरासत वर्ग से बुलाया जा सकता है। (जावा के विपरीत जहाँ इसे किसी भी वर्ग द्वारा एक ही पैकेज में बुलाया जा सकता है।)
Rhys van der Waerden

9
@RhysvanderWaerden C # इस पहलू में C ++ के समान है। मुझे यह बहुत अजीब लगता है कि जावा एक सदस्य को घोषित करने की अनुमति नहीं देता है जो उपवर्ग के लिए सुलभ है, लेकिन पूरे पैकेज में नहीं। यह मेरे लिए उल्टा है - एक पैकेज बाल वर्ग की तुलना में व्यापक गुंजाइश है!
कोनराड मोरव्स्की

15
@KonradMorawski IMHO पैकेज उपवर्ग से छोटा क्षेत्र है। यदि आपने अपनी कक्षा को अंतिम रूप से घोषित नहीं किया है, तो उपयोगकर्ताओं को इसे उप-वर्ग करने में सक्षम होना चाहिए - इसलिए संरक्षित जावा आपके प्रकाशित इंटरफ़ेस का हिस्सा है। OTOH, संकुल को एक ही संगठन द्वारा विकसित किया जाता है: जैसे com.mycompany.mypackage। यदि आपका कोड मेरे पैकेज में खुद को घोषित करता है, तो आप खुद को मेरे संगठन का हिस्सा घोषित करते हैं, इसलिए हमें संवाद करना चाहिए। इस प्रकार, पैकेज उपवर्ग (दर्शकों जो मेरी वस्तु का विस्तार करते हैं) की तुलना में दर्शकों (मेरी कंपनी के लोगों) तक पहुंचने के लिए एक छोटे / आसान को प्रकाशित करता है और इसलिए कम दृश्यता के रूप में गिना जाता है।
नामस्रोत

2
friendवर्गों के बीच विशेष संबंधों को परिभाषित करने के लिए अच्छा है। यह कई मामलों में बेहतर एनकैप्सुलेशन की अनुमति देता है जब सही तरीके से उपयोग किया जाता है। उदाहरण के लिए इसका उपयोग विशेषाधिकार प्राप्त कारखाना वर्ग द्वारा आंतरिक निर्भरता को एक निर्मित प्रकार में इंजेक्ट करने के लिए किया जा सकता है। इसका एक बुरा नाम है क्योंकि जो लोग एक अच्छी तरह से डिज़ाइन किए गए ऑब्जेक्ट मॉडल को सही ढंग से बनाए रखने के बारे में परवाह नहीं करते हैं वे अपने काम के बोझ को कम करने के लिए इसका दुरुपयोग कर सकते हैं।
डेनिस

434

यहां तालिका का एक बेहतर संस्करण है, जिसमें मॉड्यूल के लिए एक कॉलम भी शामिल है।

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

स्पष्टीकरण

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

  • बिना एक्सेस मॉडिफ़ायर ( j) वाला सदस्य केवल उसी पैकेज में कक्षाओं में पहुँचा जा सकता है।

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

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


कौन सा संशोधक चुनना है?

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

उदाहरण:

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

(*) एनकैप्सुलेशन वास्तव में क्या है?


11
केवल यह कहना: बहुत सारे लोग हैं जिन्हें लाल / हरे रंग के रंग में अंतर करने की समस्या है। लाल / हरे (या पीले / नारंगी / ...) रंग योजनाओं का उपयोग करने वाली तालिकाओं को शायद ही कभी "बेहतर" कुछ भी हो ;-)
घोस्टकट

1
@GhostCat, मैं असहमत हूं। मैं सहज लगता है लाल / हरी संरेखित करता है "काम" कई लोगों के लिए / "काम नहीं है" के साथ, यानी यह है कई विकल्पों से बेहतर।
एनियोबेव

8
colourblindawareness.org/colour-blindness/… ... 8% कलर ब्लाइंड पुरुषों को लगभग 1% ड्यूटेरानोप्स, 1% प्रोटोनोप्स, 1% प्रोटानोमैलस और 5% ड्यूटेरोनॉक्लस में विभाजित किया जा सकता है और जैसा कि मैं उस 5% के उन 50% में से एक हूं, बाकी का आश्वासन दिया: लाल / हरी बेकार है।
भूतकाट

6
@GhostCat ओके .. यह आबादी का एक बड़ा हिस्सा है जितना मैंने उम्मीद की थी। मैंने इस कलर ब्लाइंडनेस सिम्युलेटर में इमेज अपलोड की और सभी अलग-अलग मोड्स का परीक्षण किया। यहां तक ​​कि मोनोक्रोमेसी / अक्रोमैटोप्सिया मोड में भी रंग का अंतर उचित है। क्या आप अंतर देख सकते हैं या सिम्युलेटर बंद है? (मैं अभी भी राय है कि लाल / हरा रंग लोगों को देखने के लिए बहुत सहज है।)
aioobe

3
मैं अंतर देख सकता हूं, लेकिन मैं ड्राइवरों के लाइसेंस के लिए जर्मनी में होने वाले कलर ब्लाइंडनेस टेस्ट का आधा हिस्सा भी पास करने में सक्षम हूं;;
भूतकाट

206
____________________________________________________________________
                | 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         |              |          |              |       
____________________________________________________________________

1
यह शब्दों में डालने लायक है - "संरक्षित संशोधक वस्तु को अन्य पैकेजों में उपलब्ध कराता है, जबकि डिफ़ॉल्ट / नो-संशोधक एक ही पैकेज तक पहुँच को प्रतिबंधित करता है"
vanguard69

2
@ vanguard69, protectedसंशोधक चिह्नित चीज़ (क्लास, मेथड, या फील्ड) को किसी अन्य क्लास में किसी अन्य पैकेज में उपलब्ध कराता है, केवल अगर अन्य क्लास उस क्लास का उप-वर्ग है जहाँ उस protected- चिह्नित चीज़ को घोषित किया जाता है।
अब्दुल

"nonsubbed"? "यह एक और पैकेज में उपवर्ग"? हुह। मुझे लगा कि मुझे जावा पता है।
सेह

@AlexanderFarber क्या आपने किसी विशेष ब्राउज़र कॉन्फ़िगर के लिए ऑप्टिमाइज़ किया है? यह अब मेरा क्रोम है और यह फ़ायरफ़ॉक्स है
sehe

हम्म मेरे परिवर्तन को फिर से लौटा दें
अलेक्जेंडर फार्बर

165

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

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

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

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


3
@RuchirBaronia, "दुनिया" = आवेदन में सभी कोड, भले ही वह कहीं भी हो।
Andrejs

116

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

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

सारांश

क्या इस एक्सेस स्पेसियर के साथ किसी सदस्य की पहुँच की अनुमति है?

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

एक्सेस एक्सेसर्स किस पर लागू होते हैं

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

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

सभी पहुँच विनिर्देशक वर्ग सदस्यों (निर्माणकर्ता, विधियाँ और स्थैतिक सदस्य फ़ंक्शंस, नेस्टेड क्लासेस) पर संभव हैं।

संबंधित: जावा क्लास एक्सेसिबिलिटी

गण

एक्सेस स्पेसिअर्स को सख्ती से ऑर्डर किया जा सकता है

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

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

टिप्पणियाँ

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

भीतर की कक्षाएं

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

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

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

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

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


1
"सार्वजनिक के अलावा अन्य संशोधक निषिद्ध हैं" - जावा 9 के रूप में, यह अब ऐसा नहीं है: इंटरफेस में निजी तरीके भी हो सकते हैं।
एम सी सम्राट

96

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

  • private: वर्ग गुंजाइश।
  • default(या package-private): पैकेज स्कोप।
  • protected: package scope + child(पैकेज की तरह, लेकिन हम इसे विभिन्न पैकेजों से हटा सकते हैं)। संरक्षित संशोधक हमेशा "माता-पिता-बच्चे" संबंध रखता है।
  • public: हर जगह।

परिणामस्वरूप, यदि हम पहुँच को तीन अधिकारों में विभाजित करते हैं:

  • (डी) अप्रत्यक्ष (उसी वर्ग के अंदर एक विधि से, या "इस" वाक्यविन्यास के माध्यम से)।
  • (आर) इजेक्शन (क्लास के संदर्भ में या "डॉट" सिंटैक्स के माध्यम से एक विधि का उपयोग करें)।
  • (I) nheritance (उपवर्ग के माध्यम से)।

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

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

54

बहुत ही कम समय में

  • public: हर जगह से सुलभ।
  • protected: एक ही पैकेज की कक्षाओं और किसी भी पैकेज में रहने वाले उपवर्गों द्वारा सुलभ।
  • डिफ़ॉल्ट (कोई संशोधक निर्दिष्ट नहीं): एक ही पैकेज की कक्षाओं द्वारा सुलभ।
  • private: केवल एक ही कक्षा के भीतर सुलभ।

48

जावा में सबसे गलत समझा गया पहुंच संशोधक है protected। हम जानते हैं कि यह एक अपवाद के साथ डिफ़ॉल्ट संशोधक के समान है जिसमें उपवर्ग इसे देख सकते हैं। पर कैसे? यहाँ एक उदाहरण है जो उम्मीद की उलझन को स्पष्ट करता है:

  • मान लें कि हमारे पास 2 कक्षाएं हैं; Fatherऔर Son, प्रत्येक अपने स्वयं के पैकेज में:

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
  • के एक संरक्षित विधि जोड़ें foo()करने के लिए Father

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
  • विधि foo()को 4 संदर्भों में कहा जा सकता है:

    1. एक वर्ग के अंदर जो उसी पैकेज में स्थित है जहाँ foo()परिभाषित किया गया है ( fatherpackage):

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
    2. एक उपवर्ग के अंदर, वर्तमान उदाहरण पर thisया उसके माध्यम से super:

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
    3. एक संदर्भ पर जिसका प्रकार एक ही वर्ग है:

      package fatherpackage;
      
      public class Father
      {
          public void fatherMethod(Father f)
          {
              f.foo(); // valid even if foo() is private
          }
      }
      
      -------------------------------------------
      
      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Son s)
          {
              s.foo();
          }
      }
    4. एक संदर्भ पर जिसका प्रकार मूल वर्ग है और यह उस पैकेज के अंदर है जहाँ foo()परिभाषित किया गया है ( fatherpackage) [इसे संदर्भ संख्या के अंदर शामिल किया जा सकता है। 1]:

      package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
  • निम्नलिखित स्थितियाँ मान्य नहीं हैं।

    1. एक संदर्भ पर जिसका प्रकार मूल वर्ग है और यह उस पैकेज के बाहर है जहाँ foo()परिभाषित किया गया है ( fatherpackage):

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
    2. एक उपवर्ग के एक पैकेज के अंदर एक गैर-उपवर्ग (एक उपवर्ग अपने माता-पिता से संरक्षित सदस्यों को विरासत में मिला है, और यह उन्हें गैर-उपवर्गों के लिए निजी बनाता है):

      package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }

Object#clone()एक protectedसदस्य का एक उदाहरण है ।
Eng.Fouad

super.foo()पहली अवैध स्थिति करने में क्या अंतर है f.foo()?
cst1992

1
@ cst1992 यह भ्रामक है, लेकिन जावा लैंग्वेज स्पेसिफिकेशन 6.6.2 देखें: "किसी संरक्षित सदस्य या कंस्ट्रक्टर को उस पैकेज के बाहर से एक्सेस किया जा सकता है जिसमें उसे केवल उस कोड द्वारा घोषित किया जाता है जो उस ऑब्जेक्ट के कार्यान्वयन के लिए जिम्मेदार है"। Super.foo () के साथ संदर्भ "सुपर" "कार्यान्वयन के लिए सीधे जिम्मेदार" है, लेकिन "एफ" संदर्भ नहीं है। क्यों? क्योंकि आप 100% निश्चित हो सकते हैं कि "सुपर" टाइप फादर का है, लेकिन "एफ" के लिए नहीं; रन-टाइम में यह पिता के कुछ अन्य उप-प्रकार हो सकते हैं। देखें docs.oracle.com/javase/specs/jls/se9/html/...
skomisa

1
यह समझने वाले किसी व्यक्ति के उत्तर को पढ़ने के लिए ताज़ा है protected। दुर्भाग्य से, इस पृष्ठ के अन्य सभी उत्तर जो protectedइसे परिभाषित करते हैं, वे इसे थोड़ा गलत पाते हैं।
दाऊद इब्न करीम

30

निजी

  • तरीके, चर और कंस्ट्रक्टर

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

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

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

ध्यान दें

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


संरक्षित

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

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

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

ध्यान दें

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


जनता

एक वर्ग, विधि, निर्माणकर्ता, इंटरफ़ेस आदि घोषित सार्वजनिक किसी भी अन्य वर्ग से पहुँचा जा सकता है।

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

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

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

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


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

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

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

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

ध्यान दें

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

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

संदर्भ लिंक

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


21

अंतर पहले से उपलब्ध कराए गए लिंक में पाया जा सकता है, लेकिन जिसका उपयोग करने के लिए आमतौर पर "सिद्धांत के सिद्धांत" के लिए नीचे आता है। केवल कम से कम दृश्यता की आवश्यकता होती है।


20

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

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

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

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


17

एक्सेस मॉडिफायर कई स्तरों पर पहुंच को प्रतिबंधित करने के लिए हैं।

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

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

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

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

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

बेस क्लास में परिभाषित संरक्षित क्षेत्र तक पहुँचने के लिए आप चाइल्ड क्लास का ऑब्जेक्ट बना सकते हैं।

निजी: यह एक ही कक्षा में पहुँचा जा सकता है।

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


16

जावा में मॉडिफायर एक्सेस करें।

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

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();
  }
}

आउटपुट: नमस्कार

यहां छवि विवरण दर्ज करें


14
  • सार्वजनिक - आवेदन में कहीं से भी सुलभ।

  • डिफ़ॉल्ट - पैकेज से सुलभ।

  • संरक्षित - पैकेज से और अन्य पैकेज में उप-वर्गों से सुलभ। भी

  • निजी - अपनी कक्षा से ही सुलभ।


14

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

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

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

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

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

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(){
    }

}

12

यह पृष्ठ संरक्षित और डिफ़ॉल्ट पहुँच संशोधक के बारे में अच्छी तरह से लिखता है

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

लेकिन ये संरक्षित सदस्य "विरासत के माध्यम से पैकेज के बाहर सुलभ" हैं। यानी आप किसी वर्ग के एक संरक्षित सदस्य को उसके उपवर्ग में किसी अन्य पैकेज में सीधे पहुंच सकते हैं जैसे कि वह सदस्य उपवर्ग में ही मौजूद हो। लेकिन अभिभावक वर्ग के संदर्भ का उपयोग करके संरक्षित सदस्य पैकेज के बाहर उपवर्ग में सुलभ नहीं होगा। ....


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

9

डेविड का जवाब प्रत्येक एक्सेस संशोधक का अर्थ प्रदान करता है। जब तक प्रत्येक का उपयोग करने के लिए, मैं सभी वर्गों और प्रत्येक वर्ग के तरीकों को सार्वजनिक करने का सुझाव दूंगा जो बाहरी उपयोग (इसके एपीआई), और बाकी सभी निजी के लिए हैं।

समय के साथ आप कुछ वर्गों को निजी बनाने के लिए और उपवर्गों में उपयोग के लिए संरक्षित कुछ विधियों को घोषित करने के लिए एक समझ विकसित करेंगे।


6

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

यह Java Access Modifiers से संबंधित है ।

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

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

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

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

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

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

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

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

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
 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     
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

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

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


1
वास्तव में पूरक क्या है, और यह मौजूदा पोस्ट का संपादन क्यों नहीं है?
सेह

पूरक पहुँच संशोधक है। एक संपादन क्यों नहीं? ऐतिहासिक उत्तर के लिए स्वीकार किए गए उत्तर को अनछुए रखने के लिए और मेरा उत्तर देने के लिए।
יךו אוהב אות

5

सार्वजनिक संरक्षित डिफ़ॉल्ट और निजी एक्सेस संशोधक हैं।

वे इनकैप्सुलेशन या छिपाने और कक्षा की सामग्री को दिखाने के लिए हैं।

  1. कक्षा सार्वजनिक या डिफ़ॉल्ट हो सकती है
  2. कक्षा के सदस्य सार्वजनिक, संरक्षित, डिफ़ॉल्ट या निजी हो सकते हैं।

निजी वर्ग के बाहर पहुंच योग्य नहीं है डिफ़ॉल्ट केवल पैकेज में सुलभ है। पैकेज में संरक्षित और साथ ही किसी भी वर्ग जो इसे बढ़ाता है। जनता सभी के लिए खुली है।

आम तौर पर, सदस्य चर निजी परिभाषित किए जाते हैं, लेकिन सदस्य विधियां सार्वजनिक होती हैं।


Defaultएक पहुँच संशोधक नहीं है, और दो अन्य गलत हैं।
user207421

5

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

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

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

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

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

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

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


4

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

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

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

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

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


4

जावा एक्सेस को संशोधित करता है जिसका आप उपयोग कर सकते हैं

यहां छवि विवरण दर्ज करें

पहुँच संशोधक के लिए लागू किया जा सकता है class, field[हमारे बारे में] , method। इस तक पहुँचने, उपवर्ग या ओवरराइड करने का प्रयास करें।

  • के माध्यम से fieldया तक पहुंच है ।methodclass
  • विरासत। उत्तराधिकारी class(उपवर्ग) पहुंच संशोधक कोई भी हो सकता है। उत्तराधिकारी method(ओवरराइड) एक्सेस संशोधक समान होना चाहिए या इसका विस्तार करना चाहिए

शीर्ष स्तर की कक्षा (प्रथम स्तर की गुंजाइश) publicऔर हो सकती है defaultNested class[के बारे में] उनमें से कोई भी हो सकता है

package पैकेज पदानुक्रम पर लागू नहीं होता है

स्विफ्ट एक्सेस संशोधक


2

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

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

हम सभी प्राइवेट, पब्लिक जैसे मेथड और मेंबर मॉडिफायर का इस्तेमाल करते हैं, ... लेकिन एक बात जो बहुत कम डेवलपर्स करते हैं, वह है पैकेज का इस्तेमाल लॉजिकल रूप से ऑर्गनाइज करने के लिए ।

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

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

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

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


2

निजी-सुरक्षित-सार्वजनिक-सही-सादृश्य के लिए-चर-डेटा-प्रकार

ब्लॉक आरेख की व्याख्या कैसे की डेटा सदस्यों के बाद आधार वर्ग रहे हैं विरासत में मिला है जब व्युत्पन्न वर्ग पहुँच विधा है निजी

यहां छवि विवरण दर्ज करें

नोट: निजी एक्सेस स्पेसियर के साथ डेटा सदस्यों की घोषणा को डेटा छिपाना के रूप में जाना जाता है

स्रोत: एक्सेस स्पेसिफिकर्स - निजी, सार्वजनिक और संरक्षित


1
सवाल जावा के बारे में था, न कि C ++ का।
बेनोइट

1
@Benoit लेकिन मैंने क्या पोस्ट किया है, विशेष रूप से चित्र, दोनों के लिए समान नहीं हैं: जावा और सी ++? यह नियम जावा के लिए भी लागू नहीं हो रहे हैं? धन्यवाद
leonidaa

2
C ++ में केवल 3 संशोधक हैं, जबकि जावा में 4 हैं।
बेनोइट

1
सादृश्य अच्छा है, लेकिन डिफ़ॉल्ट पहुंच विनिर्देश गायब है,
एमएस

1
ओपी ने सवाल पूछा "जावा में सार्वजनिक, संरक्षित, पैकेज-निजी और निजी के बीच अंतर क्या है?"
JL_SO 21

2

मेरे दो सेंट :)

निजी:

वर्ग -> एक शीर्ष स्तरीय वर्ग निजी नहीं हो सकता। आंतरिक कक्षाएं निजी हो सकती हैं जो एक ही वर्ग से सुलभ हैं।

उदाहरण चर -> केवल कक्षा में सुलभ। कक्षा के बाहर नहीं पहुंच सकता।

पैकेज-निजी:

क्लास -> एक टॉप लेवल क्लास पैकेज-प्राइवेट हो सकती है। यह केवल एक ही पैकेज से सुलभ हो सकता है। उप पैकेज से नहीं, बाहर के पैकेज से नहीं।

उदाहरण चर -> एक ही पैकेज से सुलभ। उप पैकेज से नहीं, बाहर के पैकेज से नहीं।

संरक्षित:

वर्ग -> एक शीर्ष स्तर की कक्षा को संरक्षित नहीं किया जा सकता है।

उदाहरण चर -> केवल एक ही पैकेज या उप-पैकेज में सुलभ। केवल क्लास से बाहर निकलते समय पैकेज के बाहर पहुँचा जा सकता है।

जनता:

वर्ग -> पैकेज / उप पैकेज / अन्य पैकेज से सुलभ

उदाहरण चर -> पैकेज / उप पैकेज / अन्य पैकेज से सुलभ

यहाँ विस्तृत जवाब है

https://github.com/junto06/java-4-beginners/blob/master/basics/access-modifier.md


1
  • जनता

    यदि किसी वर्ग के सदस्य को सार्वजनिक घोषित किया जाता है तो उसे कहीं से भी पहुँचा जा सकता है

  • संरक्षित

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

  • चूक

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

  • निजी

    यदि किसी वर्ग के सदस्य को कीवर्ड द्वारा संरक्षित घोषित किया जाता है तो इस मामले में यह केवल उसी वर्ग के सदस्यों के लिए उपलब्ध है


-1

जावा में एक्सेस स्पेसिफायर: जावा में 4 एक्सेस स्पेसिफायर हैं, अर्थात् निजी, पैकेज-प्राइवेट (डिफ़ॉल्ट), एक्सेस ऑर्डर बढ़ाने में संरक्षित और सार्वजनिक।

निजी : जब आप कुछ वर्ग विकसित कर रहे हैं और आप चाहते हैं कि इस वर्ग के सदस्य इस वर्ग के बाहर उजागर न हों तो आपको इसे निजी घोषित करना चाहिए। निजी सदस्यों को केवल उस कक्षा में पहुँचा जा सकता है जहाँ उन्हें परिभाषित किया गया है अर्थात कक्षा को घेरना। निजी सदस्यों को 'इस' संदर्भ पर और इन सदस्यों को संलग्न करने वाले वर्ग के अन्य उदाहरणों पर भी पहुँचा जा सकता है, लेकिन केवल इस वर्ग की परिभाषा के भीतर।

पैकेज-प्राइवेट (डिफ़ॉल्ट) : यह एक्सेस स्पेसियर नीचे वर्णित एक्सेस के अलावा निजी एक्सेस स्पेसियर द्वारा निर्दिष्ट एक्सेस प्रदान करेगा।

जब आप कुछ पैकेज विकसित कर रहे होते हैं और इसलिए उसके भीतर कुछ वर्ग (कहते हैं Class1), तो आप अपने (उसी) पैकेज के भीतर अन्य वर्गों के लिए, कक्षा के भीतर के सदस्य को बेनकाब करने के लिए, डिफ़ॉल्ट का उपयोग कर सकते हैं (स्पष्ट रूप से उल्लेख नहीं किया जा सकता है)। इन अन्य वर्गों (एक ही पैकेज के भीतर) में, आप कक्षा 1 के उदाहरण पर इन डिफ़ॉल्ट सदस्यों तक पहुंच सकते हैं। इसके अलावा आप Class1 के उपवर्गों के भीतर इन डिफ़ॉल्ट सदस्यों तक पहुँच सकते हैं, Class2 (इस संदर्भ में या Class1 के उदाहरण पर या Class2 के उदाहरण पर) कह सकते हैं।

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

संरक्षित : यह एक्सेस स्पेसियर नीचे बताए गए एक्सेस के अलावा पैकेज-प्राइवेट एक्सेस स्पेसियर द्वारा निर्दिष्ट एक्सेस प्रदान करेगा।

जब आप कुछ पैकेज विकसित कर रहे होते हैं और इसलिए उसके भीतर कुछ वर्ग (कहते हैं Class1), तो आपको Class1 के भीतर डेटा सदस्य के लिए संरक्षित एक्सेस स्पेसियर का उपयोग करना चाहिए, यदि आप नहीं चाहते कि यह सदस्य आपके पैकेज के बाहर पहुंच सके (उपभोक्ता के पैकेज के अनुसार) आपका पैकेज यानी क्लाइंट जो आपके एपीआई का उपयोग कर रहा है) सामान्य तौर पर, लेकिन आप अपवाद बनाना चाहते हैं और इस सदस्य तक तभी पहुंच की अनुमति देते हैं जब क्लाइंट क्लास 2 कहता है जो क्लास 1 का विस्तार करता है। तो, सामान्य रूप से, संरक्षित सदस्य व्युत्पन्न वर्गों अर्थात क्लास 2 में 'इस' संदर्भ पर और कक्षा 2 के स्पष्ट उदाहरणों पर भी सुलभ होंगे।

कृपया ध्यान दें:

  1. यदि आप Class1 के स्पष्ट उदाहरण पर इसे एक्सेस करने का प्रयास करते हैं, तो आप Class2 में Class1 के विरासत वाले संरक्षित सदस्य तक नहीं पहुंच सकते हैं, हालांकि इसमें यह विरासत में मिला है।
  2. जब आप Class2 को एक ही / अलग पैकेज में लिखते हैं, जो Class2 का विस्तार करता है, तो Class1 से संरक्षित सदस्य इस संदर्भ में और कक्षा 3 के स्पष्ट उदाहरण पर भी उपलब्ध होगा। यह किसी भी पदानुक्रम के लिए सही होगा जो विस्तारित है या संरक्षित सदस्य अभी भी विस्तारित वर्ग के इस संदर्भ या उदाहरण पर सुलभ होगा। ध्यान दें कि Class3 में, यदि आप Class2 का उदाहरण बनाते हैं, तो आप Class1 से सुरक्षित सदस्य तक पहुँच नहीं पाएँगे, हालाँकि यह विरासत में मिला है।

इसलिए नीचे की रेखा है, संरक्षित सदस्यों को अन्य पैकेजों में एक्सेस किया जा सकता है, केवल अगर इस अन्य पैकेज से कुछ वर्ग, इस संरक्षित सदस्य को संलग्न करते हुए वर्ग का विस्तार करता है और संरक्षित सदस्य को विस्तारित श्रेणी के भीतर 'इस' संदर्भ या स्पष्ट उदाहरणों पर पहुँचा जाता है। कक्षा।

सार्वजनिक : यह एक्सेस स्पेसियर नीचे वर्णित एक्सेस के अलावा संरक्षित एक्सेस स्पेसियर द्वारा निर्दिष्ट एक्सेस प्रदान करेगा।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.