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




private public (20)

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

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

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

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

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

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

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

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

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

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


निजी

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

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

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

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

ध्यान दें

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

संरक्षित

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

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

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

ध्यान दें

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

जनता

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

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

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

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

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

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

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

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

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

ध्यान दें

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

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

संदर्भ लिंक

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


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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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


                | 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         |       ✔       |     ✘     |       ✘       |   ✘    

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

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

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


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

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

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

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

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

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

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

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

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

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

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ 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. डिफ़ॉल्ट:

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

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

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

आउटपुट: हैलो


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

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

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

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

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


बहुत कम में

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

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

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

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

    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 उदाहरण के माध्यम से वर्तमान उदाहरण पर, सबक्लास के अंदर:

      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
          }
      }
      

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

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


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

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

+ : accessible
blank : not accessible

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

  • निजी : वर्ग का दायरा।
  • डिफ़ॉल्ट (या पैकेज-निजी ): पैकेज स्कोप।
  • संरक्षित : पैकेज स्कोप + बच्चा (पैकेज की तरह, लेकिन हम इसे विभिन्न पैकेजों से उप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   |
+—————————————————+————————————+———————————+

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

स्पष्टीकरण

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

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

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

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

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

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

उदाहरण:

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

}

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

  • गैर-सदस्य प्रकार (यानी, कक्षाएं, enums, interfaces, और एनोटेशन प्रकार किसी अन्य प्रकार के अंदर घोषित नहीं किए गए हैं) डिफ़ॉल्ट रूप से पैकेज-निजी हैं। ( जेएलएस §6.6.1 )

  • क्लास के सदस्य और कन्स्ट्रक्टर डिफ़ॉल्ट रूप से पैकेज-प्राइवेट हैं। ( जेएलएस §6.6.1 )

  • Enum रचनाकार डिफ़ॉल्ट रूप से निजी हैं । (वास्तव में, enum contructors निजी होना चाहिए, और यह उन्हें सार्वजनिक या संरक्षित करने की कोशिश करने में एक त्रुटि है)। एनम स्थिरांक सार्वजनिक हैं, और किसी भी एक्सेस विनिर्देशक की अनुमति नहीं देते हैं। Enums के अन्य सदस्य डिफ़ॉल्ट रूप से पैकेज-निजी हैं। ( जेएलएस §8.9 )

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





access-modifiers