एक वर्ग को संरक्षित के रूप में परिभाषित क्यों नहीं किया जा सकता है?


89

हम एक वर्ग को परिभाषित क्यों नहीं कर सकते protected?

मुझे पता है कि हम नहीं कर सकते, लेकिन क्यों? कुछ विशिष्ट कारण होना चाहिए।


3
यदि आप एक वर्ग को संरक्षित घोषित करते हैं तो यह क्या करेगा ?

1
मुझे लगता है कि यह वही है जो आप ढूंढ रहे हैं: stackoverflow.com/questions/2534733/java-protected-classes : D
dewijones92

2
चलिए हम बताते हैं कि बाहरी वर्ग की सुरक्षा क्यों नहीं की जा सकती है? भीतरी वर्गों की रक्षा की जा सकती है।
229 पर नंबर 945

जवाबों:


101

क्योंकि इसका कोई मतलब नहीं है।

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

आप नेस्टेड और आंतरिक वर्गों को संरक्षित या निजी घोषित कर सकते हैं, हालांकि।


> चूंकि जावा में 'सबपेकेज' या 'पैकेज-इनहेरिटेंस' जैसी कोई अवधारणा नहीं है, इसलिए वर्ग संरक्षित या पैकेज-प्राइवेट घोषित करना एक ही बात होगी। संरक्षित श्रेणी में पैकेज-निजी के समान दृश्यता क्यों होगी? क्या यह जनता के समान नहीं है? धन्यवाद।
यिरोमिर

@ नीकिता रायबैक क्या आप समझा सकते हैं कि उप-पैकेज या पैकेज-इनहेरिटेंस क्या है? मैं अभी भी स्पष्ट नहीं हूं कि संरक्षित का उपयोग शीर्ष स्तर के वर्ग में क्यों किया जाता है। यदि आप उदाहरण के साथ समझाते हैं कि यह महान होगा।
ऐप कार्ट

जब आप कक्षा के सदस्य को घोषित करते हैं, तो उसकी दृश्यता संरक्षित होती है , उसी पैकेज पर कक्षाएं होती हैं (जिसे पैकेज एक्सेस कहा जाता है) और उपवर्ग । यदि आप अन्य पैकेज में एक आउट्टर क्लास से एक्सेस करने का प्रयास करते हैं तो यह संरक्षित विधि सदस्य दिखाई नहीं देता है।
केलग्विन

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

2
"क्योंकि यह कोई मतलब नहीं है" - यह एक बोल्ड बयान है। यह जावा में परिभाषित नहीं है, लेकिन इसी तरह की बातों करते भी मौजूद हैं; जैसे openकोटलिन में जो मौजूदा पैकेज के बाहर सबक्लासिंग की अनुमति देता है (कोई protectedजावा में इसे रोकने की कल्पना कर सकता है, विपरीत डिफ़ॉल्ट के साथ)।
राफेल

41

जैसा कि आप जानते हैं कि डिफॉल्ट पैकेज स्तर तक पहुंच के लिए है और संरक्षित पैकेज स्तर और गैर-पैकेज कक्षाओं के लिए है, लेकिन जो इस वर्ग का विस्तार करता है (यहां ध्यान दिया जाना है कि आप वर्ग को केवल तभी बढ़ा सकते हैं जब यह दिखाई दे रहा हो!)। आइए इसे इस तरह से रखें:

  • संरक्षित शीर्ष-स्तरीय वर्ग अपने पैकेज में कक्षाओं के लिए दृश्यमान होगा।
  • अब यह पैकेज (उपवर्गों) के बाहर दिखाई देना थोड़ा भ्रामक और मुश्किल है। किन वर्गों को हमारे संरक्षित वर्ग को विरासत में देने की अनुमति दी जानी चाहिए?
  • यदि सभी वर्गों को उपवर्ग की अनुमति दी जाती है तो यह सार्वजनिक अभिगम विनिर्देशक के समान होगा।
  • यदि कोई नहीं है तो यह डिफ़ॉल्ट के समान है।

चूँकि इस वर्ग को केवल कुछ वर्गों द्वारा उपवर्गित करने पर रोक लगाने का कोई तरीका नहीं है (हम पैकेज में पैकेज के बाहर / उपलब्ध सभी वर्गों में से केवल कुछ वर्गों द्वारा विरासत में प्राप्त होने वाले वर्ग को प्रतिबंधित नहीं कर सकते हैं), संरक्षित अभिगम निर्दिष्टकों का कोई उपयोग नहीं है। शीर्ष स्तर की कक्षाओं के लिए। इसलिए इसकी अनुमति नहीं है।


3
"अब पैकेज (उपवर्गों) के बाहर एक संरक्षित वर्ग दिखाई दे रहा है जो थोड़ा भ्रामक और पेचीदा है। किन वर्गों को हमारे संरक्षित वर्ग को विरासत में प्राप्त करने की अनुमति दी जानी चाहिए? और यदि सभी वर्गों को उपवर्ग की अनुमति दी जाती है तो यह सार्वजनिक पहुंच विवरण के समान होगा।" वास्तव में मुझे इस समस्या को समझने में मदद मिली कि संरक्षित वर्ग समझ में क्यों नहीं आते हैं :)
user1338998


3

@ नीकिता रायबाक जवाब में अच्छे अंक हैं, लेकिन विवरणों की कमी है, मैं केवल अपने आप को गहराई से सोचने के बिना विचार प्राप्त नहीं कर सकता, निम्नलिखित वह है जो मैंने सोचा था और अब मुझे पूरी तरह से इसका कारण समझना चाहिए।

चार पहुँच संशोधक, मान लें कि 1 स्तर सार्वजनिक है और 4 वां स्तर निजी है ( क्रम में इस तालिका के आधार पर )। पहली चीज जो हमें पता होनी चाहिए वह यह है कि वर्ग को शीर्ष-स्तर में निजी के रूप में परिभाषित नहीं किया जा सकता है।

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

लेकिन नेस्टेड निजी वर्ग की अनुमति है क्योंकि प्रत्यक्ष बाहरी वर्ग है, पैकेज नहीं है, जैसे :

class PrivateNestedMain {
    private static class Inner {
        public static void main(String[] args) {
            System.out.println("Hello from Inner!");
        }
    }
}

अब क्या होगा अगर "संरक्षित वर्ग फू" की अनुमति है? संरक्षित मुख्य विशेषता उपवर्ग है, इसलिए बाहरी (पैकेज) SHOULD (अप-टू-स्कोप के कारण, लेकिन फिर भी यह वैकल्पिक है) उप- वर्ग की शैली प्रदान करता है , यानी उप-पैकेज, या package A extends package B, लेकिन हम ऐसी किसी भी चीज को नहीं जानते हैं। इसलिए संरक्षित शीर्ष स्तर में पूर्ण क्षमता (मुख्य गुंजाइश उपवर्ग चौड़ा) का उपयोग नहीं कर सकता है जो बाहरी पैकेज है (अर्थात ऐसी कोई उप-पैकेज चीज नहीं है), लेकिन संरक्षित नेस्टेड क्लास में पूरी क्षमता का उपयोग कर सकते हैं जो बाहरी है ( यानी उपवर्ग हो सकता है) :

class ProtectedNestedMain {
    protected static class Inner {
        public static void main(String[] args) {
            System.out.println("Hello from Inner!");
        }
    }
}

ध्यान दें कि उपर्युक्त ने कहा कि "पूर्ण क्षमता का उपयोग नहीं कर सकते हैं" क्योंकि यह उप-वाइड-वाइड तक नहीं पहुंच सकता है, क्योंकि कोई बाहरी उपवर्ग नहीं है, इसका मतलब है कि वास्तव में संरक्षित किया जा सकता है , इसकी अनुमति है , पैकेज की नौकरी से बचने के लिए यह केवल एक विकल्प है। -प्राकृतिक यदि बाहरी उपवर्ग सक्षम नहीं है , तो नीचे देखें।

मेरा भ्रम मुख्य रूप से प्रसिद्ध तालिका https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html पर होता है :

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

यदि 1 स्तर (सार्वजनिक) और 3 जी स्तर (पैकेज-निजी) की अनुमति दी गई है, तो कैसे पृथ्वी पर 2-स्तर (संरक्षित) के बीच की अनुमति नहीं है?

सार्वजनिक समर्थन उपवर्ग भ्रामक करने के लिए इतना आसान है। इस तालिका को पढ़ने का सही तरीका है

सार्वजनिक समर्थन उपवर्ग अगर बाहरी उपवर्ग सुविधा है।

पैकेज-प्राइवेट के लिए एक ही भ्रामक लागू होता है, पैकेज-प्राइवेट उप-वर्ग का समर्थन नहीं करता है ( एन इन सेल) का मतलब बाहरी में उप-वर्ग अवधारणा लागू नहीं है।

इसका मतलब है कि अगर हम उपवर्ग सुविधा बाहरी में उपलब्ध नहीं है, तो हमें उपवर्ग कॉलम को अनदेखा करना चाहिए :

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

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

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


3

संरक्षित क्षेत्र को परिभाषित करना उस क्षेत्र को पैकेज के अंदर और साथ ही पैकेज के बाहर विरासत के माध्यम से सुलभ बनाता है (केवल चाइल्ड क्लास के अंदर)।

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

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

अधिक जानकारी के लिए पढ़ें कि बाहरी जावा वर्ग निजी या संरक्षित क्यों नहीं हो सकता है


3
कृपया किसी भी संबद्धता का खुलासा करें और पोस्टिंग के माध्यम से अपनी साइट को बढ़ावा देने के लिए साइट के रूप में उपयोग न करें। देखिए मैं एक अच्छा उत्तर कैसे लिखूं?

1

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

उदाहरण:

package 2;
class B
{
protected void method1()
{
}
}
package 1;
import 2.B;
class A extends B
{
//can access protected method
}
class C extends A
{
//can't access the protected method
}

0

"संरक्षित" = "डिफ़ॉल्ट" का व्यवहार + "किसी भी पैकेज में किसी भी उपवर्ग में इसका उपयोग करें" का व्यवहार।

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


0

संरक्षित : केवल पैकेज स्तर * तक देखें।

वर्ग को संरक्षित परिभाषित किया गया है ---> इसे बाहरी पैकेज से नहीं बढ़ाया जा सकता (दिखाई नहीं देता)।

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

वही निजी परिभाषित कक्षाओं पर लागू होता है ।

नोट: नेस्टेड या आंतरिक वर्गों को संरक्षित या निजी परिभाषित किया जा सकता है ।

* - संरक्षित कीवर्ड का पता लगाएं , इस जवाब के लिए मैंने इसे सफल बनाया।


0

@ आकाश 5288 के जवाब से मुझे कोई मतलब नहीं था:

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

चूँकि इस वर्ग को केवल कुछ वर्गों द्वारा उपवर्गित करने पर रोक लगाने का कोई तरीका नहीं है (हम पैकेज में पैकेज के बाहर / उपलब्ध सभी वर्गों में से केवल कुछ वर्गों द्वारा विरासत में प्राप्त होने वाले वर्ग को प्रतिबंधित नहीं कर सकते हैं), संरक्षित अभिगम निर्दिष्टकों का कोई उपयोग नहीं है। शीर्ष स्तर की कक्षाओं के लिए। इसलिए इसकी अनुमति नहीं है।

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

उत्तर "आप जिस वर्ग का उपयोग नहीं कर सकते, उसका विस्तार नहीं कर सकते / देख सकते हैं" अधिक तार्किक है।


0

इस प्रश्न का क्या अर्थ है, JVM C (Sun JVM) और C ++ (oracle JVM) में लिखा गया है, इसलिए संकलन के दौरान, हम अपनी जावा फाइल से .class फाइलें बनाने जा रहे हैं और यदि हम संरक्षित कीवर्ड वाली एक कक्षा घोषित करते हैं। तब यह JVM द्वारा एक्सेस नहीं किया जाएगा।

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

इसी तरह, एक शीर्ष स्तर वर्ग निजी नहीं हो सकता। नीचे के रूप में स्पष्टीकरण:

तो क्या होगा यदि हम एक वर्ग को परिभाषित करेंगे निजी, वह वर्ग केवल उस इकाई के भीतर ही सुलभ होगा जिसमें वह परिभाषित है जो हमारे मामले में उसका पैकेज है?

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


0

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

उदाहरण:

package a;
class parent{
 protected void p();
}
package b;
import a.p;
class child extends parent{
  //you can access method which is protected in the parent in the child 
}
class another extends child {
 //here you can not access the protected method 
}

0

यदि किसी बाहरी वर्ग को संरक्षित घोषित किया जाता है, तो मुझे लगता है कि आप चाहते हैं कि वर्ग को केवल एक ही पैकेज और उसके उपवर्गों से अलग-अलग पैकेजों तक पहुँचा जा सके। हालाँकि, संरक्षित वर्ग के लिए उपवर्ग बनाने की कोई संभावना नहीं है, क्योंकि जब आप "क्लास डॉग एक्सटेंडेड एनिमल" लिखते हैं, तो संरक्षित "एनीमल" के कारण ही उसके सबक्लास तक पहुँचा जा सकता है, जाहिर है, "डॉग" "एनिमल" सबस्क्राइब नहीं है ।

तो संरक्षित बाहरी वर्ग (डिफ़ॉल्ट) बाहरी वर्ग के साथ समान है!

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