जावा में डिफ़ॉल्ट एक्सेस स्पेसियर क्या है?


108

मैंने सिर्फ एक जावा पुस्तक पढ़ना शुरू किया और सोचा; यदि कोई निर्दिष्ट नहीं है, तो कौन-सी एक्सेस स्पेसियर डिफ़ॉल्ट है?


सही शब्द 'एक्सेस मॉडिफायर' है। शब्द 'स्पेसियर' JLS में प्रकट नहीं होता है।
लोरेन

जवाबों:


116

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

जैसा कि mdma ने बताया है, हालांकि यह इंटरफ़ेस सदस्यों के लिए सही नहीं है, जिसके लिए डिफ़ॉल्ट "सार्वजनिक" है।

जावा के एक्सेस स्पेसिफिकेशन देखें


25
गलत - इंटरफ़ेस सदस्यों के लिए सही नहीं है। डिफ़ॉल्ट पहुँच तब सार्वजनिक है
mdma

2
इसे वास्तव में 'पैकेज प्राइवेट' के रूप में जाना जाता है। तृतीय-पक्ष वेब साइटें प्रासंगिक संदर्भ नहीं हैं। आपको केवल जेएलएस का हवाला देना चाहिए।
लोरेन का

81

डिफ़ॉल्ट विनिर्देश संदर्भ पर निर्भर करता है।

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

class MyClass   // package private
{
   int field;    // package private field

   void calc() {  // package private method

   }
}

इंटरफ़ेस सदस्यों (क्षेत्रों और विधियों) के लिए, डिफ़ॉल्ट पहुंच सार्वजनिक है। लेकिन ध्यान दें कि इंटरफ़ेस घोषणा स्वयं पैकेज निजी करने के लिए चूक करती है।

interface MyInterface  // package private
{
   int field1;         // static final public

   void method1();     // public abstract
}

अगर हमारे पास घोषणा है

public interface MyInterface2 extends MyInterface
{

}

MyInterface2 का उपयोग करने वाली कक्षाएं फिर सुपर इंटरफ़ेस से फ़ील्ड 1 और मेथड 1 देख सकती हैं, क्योंकि वे सार्वजनिक हैं, भले ही वे MyInterface की घोषणा को नहीं देख सकते हैं।


1
"पैकेज निजी" (कभी-कभी स्रोत के रूप में लिखा जाता है /* pp */) केवल डिफ़ॉल्ट पहुंच के लिए एक सुविधाजनक नाम है । यह JLS नाम नहीं है।
टॉम हॉल्टिन -

10
@ टॉम - यह सही है, जेएलएस "डिफ़ॉल्ट एक्सेस" का उपयोग करता है। मैं लिख सकता था "डिफ़ॉल्ट डिफ़ॉल्ट एक्सेस है"। लेकिन यह भी मददगार नहीं लगता!
mdma

16

यदि कोई एक्सेस स्पेसियर नहीं दिया गया है, तो यह क्लास और क्लास के सदस्यों के लिए पैकेज-लेवल एक्सेस (इसके लिए कोई स्पष्ट स्पेसियर नहीं है) है। इंटरफ़ेस के तरीके स्पष्ट रूप से सार्वजनिक हैं।


9

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

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


8

यह इस बात पर निर्भर करता है कि चीज क्या है।

  • शीर्ष-स्तरीय प्रकार (जो कि, कक्षाएं, एनम, इंटरफेस और एनोटेशन प्रकार एक अन्य प्रकार के अंदर घोषित नहीं किए गए) डिफ़ॉल्ट रूप से पैकेज-निजी हैं । ( JLS J6.6.1 )

  • कक्षाओं में, सभी सदस्य (अर्थात फ़ील्ड, विधियाँ और नेस्टेड प्रकार की घोषणाएँ) और निर्माता डिफ़ॉल्ट रूप से पैकेज-निजी होते हैं । ( JLS J6.6.1 )

    • जब किसी वर्ग के पास स्पष्ट रूप से घोषित निर्माता नहीं होता है, तो कंपाइलर एक डिफ़ॉल्ट शून्य-तर्क निर्माता को सम्मिलित करता है जिसकी कक्षा के समान पहुंच निर्दिष्ट होती है । ( JLS J8.8.9 ) डिफ़ॉल्ट निर्माता को आमतौर पर हमेशा सार्वजनिक किया जाता है, लेकिन दुर्लभ मामलों में यह बराबर नहीं होता है।
  • एनम में, कंस्ट्रक्टर डिफ़ॉल्ट रूप से निजी हैं । वास्तव में, enum contructors निजी होना चाहिए, और उन्हें सार्वजनिक या संरक्षित के रूप में निर्दिष्ट करना एक त्रुटि है। Enum स्थिरांक हमेशा सार्वजनिक होते हैं , और किसी भी पहुंच विनिर्देशक की अनुमति नहीं देते हैं। एनम के अन्य सदस्य डिफ़ॉल्ट रूप से पैकेज-प्राइवेट हैं । ( JLS J8.9 )

  • इंटरफेस और एनोटेशन प्रकारों में, सभी सदस्य (फिर से, इसका मतलब है कि फ़ील्ड, तरीके और नेस्टेड प्रकार की घोषणाएं) डिफ़ॉल्ट रूप से सार्वजनिक हैं । वास्तव में, इंटरफेस और एनोटेशन प्रकार के सदस्य सार्वजनिक होने चाहिए , और उन्हें निजी या संरक्षित के रूप में निर्दिष्ट करना एक त्रुटि है। ( JLS J9.3 से 9.5 )

  • स्थानीय कक्षाओं को एक विधि, कंस्ट्रक्टर या इनिशलाइज़र ब्लॉक के अंदर घोषित कक्षाएं कहा जाता है। उन्हें .. उस ब्लॉक में स्कोप किया जाता है जिसमें वे घोषित किए जाते हैं{} और किसी एक्सेस स्पेसियर को अनुमति नहीं देते हैं। ( JLS J14.3 ) परावर्तन का उपयोग करके, आप स्थानीय कक्षाओं को कहीं और से भेज सकते हैं, और वे पैकेज-प्राइवेट हैं , हालाँकि मुझे यकीन नहीं है कि यह विवरण JLS में है।

  • बेनामी कक्षाएं कस्टम कक्षाएं हैं newजिनके साथ सीधे अभिव्यक्ति में एक वर्ग निकाय निर्दिष्ट होता है। ( JLS J15.9.5 ) उनका सिंटैक्स किसी एक्सेस स्पेसियर को अनुमति नहीं देता है। प्रतिबिंब का उपयोग करते हुए, आप गुमनाम कक्षाओं को कहीं और से भेज सकते हैं, और वे और उनके उत्पन्न निर्माता दोनों पैकेज-निजी हैं , हालांकि मुझे यकीन नहीं है कि यह विस्तार जेएलएस में है।

  • उदाहरण और ब्लॉक प्रारंभकर्ता स्थिर भाषा के स्तर पर पहुँच विनिर्देशक (की जरूरत नहीं है JLS §8.6 और 8.7 ), लेकिन ब्लॉक प्रारंभकर्ता स्थिर नाम के एक तरीके के रूप में लागू किया जाता है <clinit>( JVMs §2.9 ), तो विधि चाहिए, आंतरिक रूप से, कुछ पहुँच विनिर्देशक है। मैंने javac द्वारा संकलित कक्षाओं की और ग्रहण के संकलक द्वारा एक हेक्स संपादक का उपयोग करके जांच की और पाया कि दोनों पैकेज-प्राइवेट के रूप में विधि उत्पन्न करते हैं । हालाँकि, आप <clinit>()भाषा के भीतर कॉल नहीं कर सकते क्योंकि वर्ण <और >वर्ण विधि नाम में अमान्य हैं, और प्रतिबिंब विधियाँ इसके अस्तित्व को अस्वीकार करने के लिए कठोर हैं, इसलिए प्रभावी रूप से इसकी पहुंच विनिर्देशक नहीं है । कक्षा आरंभीकरण के दौरान वीएम द्वारा केवल विधि को बुलाया जा सकता है।इंस्टेंस इनिशियलाइज़र ब्लॉक को अलग-अलग तरीकों से संकलित नहीं किया जाता है; उनके कोड को प्रत्येक कंस्ट्रक्टर में कॉपी किया जाता है, इसलिए उन्हें प्रतिबिंब द्वारा भी व्यक्तिगत रूप से एक्सेस नहीं किया जा सकता है।


7

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

  Access Levels
    Modifier    Class   Package Subclass  EveryWhere
    public        Y        Y       Y         Y
    protected     Y        Y       Y         N
    default       Y        Y       N         N
    private       Y        N       N         N

यदि आप एक इंटरफ़ेस में एक डिफ़ॉल्ट का उपयोग करते हैं तो आप इस तरह की छूट की तरह एक विधि को लागू करने में सक्षम होंगे

public interface Computer {    
    default void Start() {
        throw new UnsupportedOperationException("Error");
    }    
}

हालाँकि यह केवल 8 जावा संस्करण से काम करेगा

आधिकारिक दस्तावेज

जावा में संशोधक का उपयोग करें


3

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


3

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


3

यहाँ जावा के निर्माता जेम्स गोसलिंग के साथ एक साक्षात्कार से पैकेज स्तर की दृश्यता के बारे में एक उद्धरण है:

बिल वेनर : जावा में चार एक्सेस स्तर हैं। डिफ़ॉल्ट पैकेज है। मैंने हमेशा सोचा है कि पैकेज एक्सेस को डिफ़ॉल्ट बनाना सुविधाजनक था क्योंकि C ++ के तीन कीवर्ड जो पहले से ही जानते थे, वे निजी, संरक्षित और सार्वजनिक थे। या अगर आपके पास कुछ विशेष कारण थे जो आपको लगा कि पैकेज का उपयोग डिफ़ॉल्ट होना चाहिए।

जेम्स गोसलिंग : एक पैकेज आम तौर पर उन चीजों का एक सेट होता है जो एक साथ लिखे गए होते हैं। इसलिए उदारता से मैं दो चीजों में से एक कर सकता था। एक आपको हमेशा एक कीवर्ड में रखने के लिए मजबूर करता है जो आपको डोमेन देता है। या मैं एक डिफ़ॉल्ट मान हो सकता था। और फिर सवाल यह है कि एक समझदार डिफ़ॉल्ट क्या है? और मैं कम से कम खतरनाक चीज के लिए जाना जाता हूं।

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

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

लेकिन दोस्तों सूची में ही एक संस्करण समस्या का कारण बनता है। और इसलिए एक दोस्ताना वर्ग की यह धारणा थी। और अच्छी बात यह है कि मैं जो डिफ़ॉल्ट बना रहा था - मैं समस्या को हल कर दूंगा ताकि कीवर्ड क्या होना चाहिए?

कुछ समय के लिए वास्तव में एक दोस्ताना कीवर्ड था। लेकिन क्योंकि सभी अन्य "पी" से शुरू होते हैं, यह "पीएच" के साथ "फीरेंडली" था। लेकिन वह केवल एक दिन के लिए वहाँ था।

http://www.artima.com/intv/gosling2P.html


2

जावा 8 को अपडेट करें defaultकीवर्ड का उपयोग : जैसा कि कई अन्य ने देखा है डिफ़ॉल्ट दृश्यता (कोई कीवर्ड नहीं)

फ़ील्ड उसी पैकेज के अंदर से पहुंच योग्य होगी, जहां कक्षा है।

नए जावा 8 फ़ीचर ( डिफॉल्ट मेथड्स ) के साथ भ्रमित नहीं होना चाहिए जो एक इंटरफ़ेस को लागू करने की अनुमति देता है जब इसके साथ लेबल किया जाता हैdefault कीवर्ड के ।

देखें: पहुंच संशोधक


1

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

यहाँ एक उपयोगी लिंक है:

जावा एक्सेस मोडिफायर्स / स्पेसिफिकर्स


-2

सबसे पहले मैं एक बात कहूं कि जावा में "एक्सेस स्पेसियर" जैसा कोई शब्द नहीं है। हमें हर चीज को "संशोधक" कहना चाहिए। जैसा कि हम जानते हैं कि अंतिम, स्थिर, सिंक्रनाइज़, अस्थिर .... को संशोधक कहा जाता है, यहां तक ​​कि सार्वजनिक, निजी, संरक्षित, डिफ़ॉल्ट, अमूर्त को भी संशोधक कहा जाना चाहिए। डिफ़ॉल्ट एक ऐसा संशोधक है जहाँ भौतिक अस्तित्व नहीं है लेकिन कोई संशोधक नहीं रखा गया है तो इसे डिफ़ॉल्ट संशोधक माना जाना चाहिए।

इसे सही ठहराने के लिए एक उदाहरण लें:

public class Simple{  
    public static void main(String args[]){  
     System.out.println("Hello Java");  
    }  
}  

आउटपुट होगा: Hello Java

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


पहला वाक्य स्पॉट-ऑन है, लेकिन यह तथ्य कि एक बाहरी वर्ग निजी नहीं हो सकता है यह साबित नहीं करता है कि जावा में एक्सेस स्पेसियर जैसी कोई चीज नहीं है।
लार्ने का

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

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