क्या जावा में "निजी संरक्षित" एक्सेस संशोधक है?


160

मैंने कुछ संदर्भों को जावा में एक्सेस मॉडिफायर के संदर्भ में देखा है private protected(दोनों शब्द एक साथ):

private protected someMethod() {

}

जिन पृष्ठों का मैंने उल्लेख किया, उनमें से एक यहाँ है । मेरे स्कूल के पाठ ने भी इस एक्सेस संशोधक का उल्लेख किया (और कहा कि यह मौजूद है)। हालाँकि, इसका उपयोग करने से जावा भाषा में त्रुटि होती है।

मैंने दोनों चर और विधियों के साथ प्रयास किया और मुझे पूरा यकीन है कि यह मौजूद नहीं है, लेकिन मैं जो कुछ हुआ उसका स्पष्टीकरण चाहता हूं। क्या इसे माना गया, फिर खारिज कर दिया गया? या जावा के नए संस्करण में इसे हटा दिया गया?

संपादित करें: मैं protectedकीवर्ड के बारे में जानकारी नहीं ढूंढ रहा हूं ।


60
आपके द्वारा पाया गया पृष्ठ "अंतिम-संशोधित" HTTP शीर्ष लेख का सेट करता है: सोम, 26 फरवरी 1996 18:14:04 GMT!
जी सिल्वी डेविस

6
@ जो मैं संभव के रूप में सवालों को बंद करने के लिए हूँ, लेकिन मुझे वहाँ एक संयुक्त संशोधक के बारे में कुछ भी नहीं दिखता हैprivate protected
jpmc26

2
@ jpmc26 देखें "जावा 1.0 में एक अतिरिक्त एक्सेस संशोधक था, निजी संरक्षित।" हालाँकि, यहाँ का उत्तर इतिहास का एक बेहतर सारांश है।
जो

2
@Joe वास्तव private protectedमें उस उत्तर में एक संदर्भ है , लेकिन यह स्पष्ट नहीं करता है कि ऐसा क्यों या क्या हुआ, जो कि यह प्रश्न क्या है।
m0skit0

3
किसी और को यह डरावना लगता है कि ओपी स्कूल में यह सीख रहा था .... डॉक्स को हटाए जाने के 20 साल बाद? दिलचस्प इतिहास सबक, लेकिन अभी भी थोड़ा डरावना है कि लोग जावा 1 नाम से पहले हटाए गए कुछ सीख रहे हैं ...
XaolingBao

जवाबों:


191

पहुँच संशोधक को हटाना

जावा में मूल रूप से private protectedसंशोधक था, लेकिन इसे JDK 1.0.2 (पहला स्थिर संस्करण, जावा 1.0 जिसे हम आज जानते हैं) में हटा दिया गया था । JDK 1.0.2 ( यहां और यहां ) के बारे में कुछ ट्यूटोरियल निम्नलिखित कहते हैं:

नोट: जावा भाषा के 1.0 रिलीज़ ने पाँच पहुँच स्तरों का समर्थन किया: चार ऊपर से सूचीबद्ध private protectedprivate protectedपहुंच का स्तर 1.0 की तुलना में जावा अधिक की संस्करणों में समर्थित नहीं है; अब आपको अपने जावा प्रोग्राम में इसका उपयोग नहीं करना चाहिए।

SoftwareEngineering.SE राज्यों पर एक और जवाब :

जावा में मूल रूप से ऐसा एक संशोधक था। यह लिखा गया था private protectedलेकिन जावा 1.0 में हटा दिया गया था ।

अब जावा संस्करण इतिहास पर एक नज़र डालें :

JDK 1.0

पहला संस्करण 23 जनवरी, 1996 को जारी किया गया था और इसे ओक कहा जाता था। पहला स्थिर संस्करण, JDK 1.0.2, जावा 1 कहलाता है।

इस से, हम 1.0.2 संस्करण के संबंध में ट्यूटोरियल का निष्कर्ष निकाल सकते हैं, पहले संस्करण, JDK 1.0, जहां भाषा को ओक कहा जाता था, का उल्लेख है, लेकिन SoftwareEngineering.SE से एक पहला स्थिर संस्करण JDK 1.0.2 जावा को संदर्भित करता है 1.0, जहां इसे हटा दिया गया था।

अब यदि आप जावा 1.0 प्रलेखन में इसे खोजने का प्रयास करते हैं , तो आप इसे नहीं पाएंगे, क्योंकि जैसा कि पहले उल्लेख किया गया है, इसे JDK 1.0.2 में हटा दिया गया था, अन्यथा जावा 1.0 के रूप में जाना जाता है। जब आप पोस्ट किए गए लिंक के लिए "अंतिम संशोधित" समय को देखते हैं तो यह फिर से साबित होता है। आपके द्वारा पोस्ट किया गया लिंक अंतिम बार 1996 के फरवरी में संशोधित किया गया था। जावा 1.0 / JDK 1.0.2, जब private protectedहटाया गया था, 1996 के फरवरी के बाद जारी किया गया था , और विनिर्देश के अनुसार, 1996 का अगस्त।

निकाले जाने का कारण

कुछ स्रोत भी इसका कारण बताते हैं private protected, जैसे कि यह । उद्धरण के लिए:

निजी सुरक्षा क्या थी?

शुरुआत में, जावा भाषा में संशोधक के कुछ संयोजनों के लिए अनुमति दी गई थी, जिनमें से एक था private protectedprivate protectedउप-वर्ग (और पैकेज एक्सेस को हटाने) के लिए दृश्यता को कड़ाई से सीमित करने का अर्थ था। बाद में इसे कुछ असंगत और अति जटिल माना गया और अब इसका समर्थन नहीं किया गया है। [५]

[५] protectedजावा के बीटा २ रिलीज़ में संशोधक का अर्थ बदल गया, और private protectedसंयोजन उसी समय दिखाई दिया। उन्होंने कुछ संभावित सुरक्षा छेदों को पैच किया, लेकिन कई लोगों को भ्रमित किया।

और SoftwareEngineering.SE भी यह कहकर इसका समर्थन करता है कि यह विसंगतियों और अतिरिक्त जटिलता के लायक नहीं था, इसलिए इसे हटा दिया गया था।

व्याख्या

इस सब के बारे में मेरी व्याख्या यह है कि शायद, ओक के दिनों में, दोनों को सह-अस्तित्व (इसलिए संयोजन) की अनुमति दी गई थी। के बाद से protectedकी अर्थ बदल गया था 1 , वहाँ अनुमति देने के लिए एक की जरूरत हो सकता है privateऔर protectedएक ही समय में। परिचय बहुत जटिल हो गया और इसके लायक नहीं था, और इस तरह अंत में गिरा दिया गया था। जब तक जावा 1.0 / JDK 1.0.2 चारों ओर लुढ़का, तब तक इसे गिरा दिया गया था और इस प्रकार इसे प्रलेखन में नहीं पाया जा सकता है।


1 में ओक भाषा विशिष्टता , धारा 4.10, चर और तरीके के लिए प्रवेश , यह पाया गया है कि डिफ़ॉल्ट संशोधक था protected:

डिफ़ॉल्ट रूप से एक वर्ग में सभी चर और तरीके संरक्षित हैं

यह आज हमारे पास मौजूद डिफ़ॉल्ट पैकेज की पहुंच से काफी अलग है। यह आवश्यकता के लिए मार्ग प्रशस्त हो सकता है private protected, क्योंकि privateबहुत अधिक प्रतिबंधात्मक protectedथा और बहुत सुस्त था।


मुझे यकीन है कि यह बहुत लायक नहीं है - लेकिन मुझे याद है कि जब ऐसा हुआ था (मैं एक बच्चे के रूप में प्रोग्रामिंग कर रहा था और किसी कारण से इस नए जावा चीज़ में था) और जब तक मुझे कोई मूल स्रोत नहीं मिल रहा है - मुझे चीजें याद हैं ठीक इसी तरह जब मैंने उनका अनुसरण किया।
बेंजामिन ग्रुएनबाम

Early on, the Java language allowed for certain combinations of modifiers, इसका मतलब यह है कि वहाँ सिर्फ "निजी संरक्षित से अधिक था?"
XaolingBao 13

@XaolingBao ठीक है, एक एक्सेसर एक एक्सीसिर की तरह है :) प्रदान किए गए लिंक आपके प्रश्न को स्पष्ट करना चाहिए।
m0skit0

52

भ्रामक / अस्पष्ट कहानियाँ हैं:

एक, प्रिंसटन स्रोत से, जिसे आपने और एमआईटी अभिलेखागार से भी , कहा था कि:

नोट: जावा भाषा के 1.0 रिलीज़ ने पांच पहुँच स्तरों का समर्थन किया: चार ऊपर सूचीबद्ध निजी संरक्षित। 1.0 से अधिक जावा के संस्करणों में निजी संरक्षित एक्सेस स्तर समर्थित नहीं है; अब आपको अपने जावा प्रोग्राम में इसका उपयोग नहीं करना चाहिए।

लेकिन यह सुविधा यहाँ या यहाँ जावा 1.0 के लिए किसी भी आधिकारिक दस्तावेज पर निर्दिष्ट नहीं है

मेरा अनुमान है कि यह सुविधा आधिकारिक 1.0 संस्करण में नहीं आई, क्योंकि आधिकारिक भाषा विनिर्देश अगस्त 1996 से है और प्रिंसटन स्रोत अंतिम बार फरवरी 1996 में संशोधित किया गया था

पुनश्च: पुराने संस्करणों के लिए अभिलेखागार को हटाने के लिए ओरेकल पर शर्म की बात है।


तो क्या मेरा लिंक उसी सामग्री का पुराना संस्करण है? : D

हो सकता है कि गुम हुई जानकारी का आपके द्वारा रखे गए नोट से कुछ लेना-देना हो।

@AndrewLi कहीं भी दिए गए संदर्भों में स्थिर नहीं बताया गया है । और यह 1.0 के रूप में 1.0.2 को संदर्भित करने के लिए निश्चित रूप से भ्रमित है जब एक वास्तविक 1.0 है।
m0skit0

10

जैसा कि आपके प्रश्न में दिए गए लिंक से पता चलता है private protectedकि element/memberएक वर्ग पर उपयोग किया गया था , जब आप चाहते हैं कि आप subclassतत्व तक पहुंच सकें, लेकिन इसे अन्य वर्गों से छिपाकर रखें package

Javaअगर तुलना C++तत्वों की एक अतिरिक्त अवधारणा है - और यह एक पैकेज है । किसी को यह भी समझना चाहिए कि पैकेज के भीतर या बाहर क्या सुलभ है Javaजब यह इन एक्सेस-स्पेसियर्स की तरह आता है private, publicऔर protected

कृपया ध्यान दें कि मैंने समझाया है कि इसका उपयोग क्यों किया गया था। पाठ्यक्रम के वर्तमान संस्करण में नहीं


मेरा लिंक मेथड ऐक्सेस के लिए है। सदस्य का उपयोग नहीं।

1
@MarkYisri का उपयोग सदस्य चर के लिए भी किया जा सकता है। पहुंच विनिर्देशक केवल विधियों पर ही नहीं बल्कि सदस्य संस्करण पर भी काम करते हैं। दूसरे शब्दों में एक्सेस स्पेसिफिकेशन्स एक इनकैप्सुलेशन कॉन्सेप्ट्स हैं और चाहे आप इसे मेम्बर मेथड्स या मेंबर वेरिएबल्स पर लागू करते हों। यह C ++ & java सहित लगभग सभी ऑब्जेक्ट ओरिएंटेड भाषाओं पर लागू होता है
प्रोग्रामर_ऑफ_थे_लगैक्सिज

ठीक है, लेकिन ट्यूटोरियल (दिलचस्प रूप से) चर पर संरक्षित निजी का उल्लेख नहीं करता है। होल्ड करें और मुझे देखने दें कि क्या कोई वैरिएबल पेज है ...

1
तुम सही हो ! यहाँ: cs.princeton.edu/courses/archive/spr96/cs333/java/tutorial/java/…

0

नहीं, आप दोनों का privateएक protectedसाथ उपयोग नहीं कर सकते । आपका ट्यूटोरियल अजीब है। आपके पास जो कुछ भी है उसे पैकेज निजी या ओटी 6 संदर्भ पैकेज संरक्षित एक्सेस कहा जाता है। यह डिफ़ॉल्ट पहुंच है जो तब सक्षम होती है जब कोई acc6 योग्यता स्पष्ट रूप से नहीं लिखी जाती है।


3
मैं जानता था कि आप इसका उपयोग नहीं कर सकते। मैं जानना चाहता हूं कि इसका क्या हुआ, जो अन्य उत्तर बेहतर बताते हैं।

4
खैर, लिंक १ ९९ ६ से है ताकि जावा का विकास लगभग एक साल पहले ही शुरू हो गया हो, लिंक की सामग्री वास्तव में इतनी अजीब नहीं है: D
कीवान

6
थिच डॉक्यूमेंट की तारीख के बारे में अच्छी बात। मैंने सवाल का जवाब दिया जबकि मायू ट्रेन आ रही थी और उसने फोन का उपयोग करते हुए लिखा था, इसलिए अगर जवाब पर्याप्त नहीं मिला तो क्षमा करें। बस मदद करना चाहता था ...
21

6
@AlexR आपकी वर्तनी की गलती से पटरी से उतरना वास्तव में एक दंड (ट्रेन) है। अभी ध्यान दिया। : D

1
@MarkYisri, विस्तृत एसओ पर उत्तर पोस्ट करने के लिए फोन का उपयोग करना सबसे अच्छा तरीका नहीं है।
एलेक्स

-2

निजी गुंजाइश मौजूदा वर्ग के पास है। जिसमें संरक्षित किया जा सकता है पैकेज के भीतर और अन्य संकुल में कक्षाओं द्वारा विस्तारित वर्ग।

निर्बाध रूप से यदि आप चाहते हैं कि आपका चर / तरीके पैकेज के बाहर पहुंचें जिसे आपको संरक्षित / सार्वजनिक रूप से परिभाषित करने की आवश्यकता है अन्यथा निजी या कुछ अन्य पहुँच विनिर्देशक।

संरक्षित तरीके आमतौर पर बाहरी पैकेज से और उप-कक्षाओं के भीतर सुलभ होते हैं, अर्थात संरक्षित परिभाषित तरीकों का लाभ उठाने के लिए एक वर्ग को संबंधित वर्ग का विस्तार करना पड़ता है।

निजी विधियों / चरों में वर्ग के दायरे होते हैं। वे कक्षा के बाहर सुलभ नहीं हो सकते।

इसलिए आप एक ही समय में निजी संरक्षित परिभाषित नहीं कर सकते हैं!


इस सवाल का जवाब नहीं दिया। मैंने पूछा कि यह काम क्यों नहीं किया। अन्य उत्तर प्रश्न का उत्तर देने का बेहतर काम करते हैं।

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