2011-10-27 18 views
9

मैं आज निम्नलिखित "अजीब" सुविधा में आए - अर्थात् - अगर आप वर्ग एक के शरीर में कक्षा एक से एक वस्तु के लिए एक संदर्भ है तो आप इस वस्तु के निजी क्षेत्रों तक पहुँच सकते हैं:जावा निजी क्षेत्र का उपयोग संभव है?

public class Foo{ 
    private int bar; 
    private Foo foo; 
    public void f() 
    { 
     if(foo.bar == bar) // foo.bar is visible here?! 
     { 
      // 
     } 
    } 
} 

किसी के पास इस बारे में अच्छी व्याख्या है?

+2

यह सुविधा काफी उपयोगी है जब आपको 'बराबर' विधि लिखनी होती है। –

+2

वही प्रश्न इस प्रकार है: http://stackoverflow.com/questions/2126984/why-is-the-access-to-a-private-field-not-forbidden, http://stackoverflow.com/questions/4340129/accessing -private-field-in-java, http://stackoverflow.com/questions/312168/java-private-field-visibility –

उत्तर

19

एक्सेस संशोधक कक्षा स्तर पर काम करते हैं, उदाहरण स्तर पर नहीं: एक ही कक्षा में सभी कोड कक्षा के सभी उदाहरणों के निजी सदस्यों तक पहुंच सकते हैं।

इसके बारे में विशेष रूप से अजीब कुछ भी नहीं।

3

चूंकि f() फ़ू का सदस्य है, इसलिए इसे Foo के निजी सदस्यों तक पहुंचने का विशेषाधिकार है। यह मेरे लिए आश्चर्य की बात नहीं है।

+0

यही कारण है कि हम foo.bar तक पहुंच सकते हैं जब foo foo class और bar का एक और उदाहरण है एक निजी क्षेत्र – asenovm

+1

@iLate: क्योंकि जिस तरह से भाषा निर्दिष्ट है ... –

+0

@iLate: मुझे लगता है कि डिजाइनरों ने अभी सी ++ के व्यवहार का पालन किया है। जेएलएस संदर्भ के लिए – LLS

0

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

इस तरह निजी कंस्ट्रक्टर्स Singletons आदि

0

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

5

यह इस तरह से होना है।

Java Language Specification हवाला देते हुए:

एक एक संदर्भ के सदस्य (वर्ग, इंटरफ़ेस, क्षेत्र, या विधि) (वर्ग, इंटरफ़ेस, या सरणी) लिख सकते हैं या एक वर्ग प्रकार के एक निर्माता पहुँचा जा सकता है केवल यदि (, अन्यथा)

  • ...
  • यदि किसी सदस्य या निर्माता निजी घोषित किया जाता है, तो पहुँच अगर और अनुमति दी है, बशर्ते यह वही भीतर होती है: प्रकार पहुँचा जा सकता है और सदस्य या निर्माता का उपयोग की अनुमति के लिए घोषित किया जाता है शीर्ष स्तर क्ला का शरीर एसएस (§7.6) जो सदस्य की घोषणा को संलग्न करता है।
  • ...
+2

+1। –

1

यदि आप 'निजी' संशोधक के इरादे कार्यान्वयन विवरण को छिपाने के लिए विचार करें यह समझ में आता है।

"इस वर्ग के लिए निजी होना चाहिए" के संदर्भ में इसके बारे में सोचने का प्रयास करें (जो जावा में "इस स्रोत के लिए निजी होना चाहिए" के बजाय "यह इस स्रोत फ़ाइल के लिए निजी होना चाहिए" के बराबर है)।

0

@Michael का उत्तर सही है। व्यवहार .NET@asenovm के कोड के लिए समान है।

इसके अलावा, यह आंतरिक कक्षाओं के लिए भी Java के लिए समान है। भले ही आप एक वैरिएबल को निजी के रूप में परिभाषित करते हैं, आप इसे एक्सेस कर सकते हैं। मुझे आश्चर्य हुआ जब मैंने पहली बार सामना किया क्योंकि यह C# के लिए अलग है।

public class WrapperClass 
{ 

    public static class NotThreadsafe { 
     private int x = 0; 
     //....   
    } 

    public static void main(String[] args) {   
    final NotThreadsafe nts=new NotThreadsafe(); 
    int x = nts.x ; // !!! THIS IS ACCESSIBLE AS WELL FOR JAVA BUT NOT.NET 
    } 
} 

यह C# नेस्टेड कक्षाओं के लिए समान नहीं है। यदि आप इस कोड को विजुअल स्टूडियो में पेस्ट करते हैं तो यह काम नहीं करता है। कंपाइलर पहुंच के स्तर के लिए परेशान करता है।

संबंधित मुद्दे