2013-05-16 9 views
6

हाल ही में, मैंने जावा में priavte फ़ील्ड तक पहुंचने का एक अप्रत्याशित व्यवहार देखा। निम्न उदाहरण है, जो व्यवहार को दिखाता है पर विचार करें:इसे किसी अन्य ऑब्जेक्ट के निजी क्षेत्र तक पहुंचने की अनुमति क्यों है?

public class A { 

    private int i; <-- private field! 

    public A(int i) { 
     this.i = i; 
    } 

    public void foo(A a) { 
     System.out.println(this.i); // 1. Accessing the own private field: good 
     System.out.println(a.i);  // 2. Accessing private field of another object! 
    } 

    public static void main(String[] args) { 
     (new A(5)).foo(new A(2)); 
    } 
} 

मैं क्यों foo विधि (2 मामले) के भीतर वर्ग A का एक और वस्तु के निजी क्षेत्र का उपयोग करने की अनुमति दी है?

+0

कृपया कोड, इनपुट/आउटपुट और HTML या XML जैसे संरचित दस्तावेज़ों के लिए कोड स्वरूपण का उपयोग करें। ऐसा करने के लिए, नमूना का चयन करें और संदेश पोस्टिंग/संपादन फ़ॉर्म के ऊपर '{}' बटन पर क्लिक करें। –

उत्तर

13

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

+3

सामुदायिक विकी? क्या यह पूर्व-खाली डाउनवोटे ढाल है? :) –

+0

@ मार्कोटोपोलनिक सं। अभ्यास में मैंने यह भी देखा कि जब उपयोगकर्ता किसी उपयोगकर्ता की तस्वीर देखते हैं तो वे ऊपर उठना पसंद करते हैं। एक सीडब्ल्यू उत्तर कम अपवॉट और कम स्वीकृति एकत्र करता है (मैं डाउनवॉट्स के लिए निश्चित रूप से नहीं कह सकता)। यदि आपको लगता है कि यह बुरा है, तो आप इसे ठीक कर सकते हैं। –

+0

यह एक अपवर्त ढाल imho है :) –

3

ऐसा इसलिए है क्योंकि वे एक ही कक्षा के हैं। जावा में इसकी अनुमति है।

आपको कई उद्देश्यों के लिए इस पहुंच की आवश्यकता होगी। उदाहरण के लिए, बराबरी के एक कार्यान्वयन में:

public class A { 
    private int i; 

    @override public boolean equals(Object obj){ 
    if(obj instanceof A){ 
     A a = (A) obj; 
     return a.i == this.i; // Accessing the private field 
    }else{ 
     return false 
    } 
    } 
} 
+0

आपको जरूरी नहीं है कि यह _need_ है, लेकिन यह इसे एक्सेस करने के लिए थोड़ा कम वर्बोज बनाता है। – NilsH

+0

हां, यदि आप एक सार्वजनिक एक्सेसर परिभाषित करते हैं तो आप 'obj.getI() 'कर सकते हैं !!! – NINCOMPOOP

+0

@NoobUnChained: क्या आपके सभी निजी क्षेत्रों में सार्वजनिक एक्सेसर्स हैं? यदि ऐसा है तो encapsulation का बिंदु क्या है? – Mohayemin

0

foo विधि एक ही कक्षा के अंतर्गत आता है के रूप में करता है चर मैं इस तरह के एक पहुंच की अनुमति देते में कोई बुराई नहीं है।

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

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