2008-11-23 18 views
17

तो मैं एक वर्ग दूसरे दिन बनाने और ग्रहण की विधि का इस्तेमाल किया बराबरी विधि बनाने के लिए जब मुझे एहसास हुआ कि यह निम्नलिखित काम कर कोड जनरेट किया गया था:जावा निजी फील्ड दृश्यता

class Test { 
    private int privateInt; 
    [...] 
    public boolean equals(Object obj) { 
    [...] 
    Test t = (Test) obj; 
    if (t.privateInt == privateInt) { 
    [...] 
    } 
} 

t.privateInt .. ???? यह निजी होने का अनुमान है! तो मुझे लगता है कि निजी, संरक्षित, पैकेज संरक्षित और सार्वजनिक के अलावा एक और क्षेत्र दृश्यता है।

तो यहां क्या हो रहा है? इसे कैसे कहा जाता है? कोई इसका उपयोग कहां करेगा? क्या यह ब्रेक encapsulation नहीं है? क्या होगा यदि कक्षा में म्यूटेटर नहीं था और मैंने इसे बदल दिया? क्या यह सी ++ के साथ भी होता है? क्या यह एक ओओ मुहावरे है? यदि नहीं, तो जावा ने ऐसा क्यों किया?

आम तौर पर, मुझे इसके बारे में जानकारी कहां मिल सकती है?

धन्यवाद।

उत्तर

24

यह एक ही कक्षा के विभिन्न उदाहरणों से सुलभ है।

this page (बोल्ड मेरा) के अनुसार

:

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

स्पष्टता के लिए मैं इस लाइन को फिर से लिखने होगी:

if (t.privateInt == this.privateInt) 

हम सहमत कर सकते हैं कि "this.privateInt" अनुमति दी जानी चाहिए: यदि आप वर्ग टेस्ट के उदाहरण के भीतर से यह तक पहुँच रहे हैं कि संदेश "बराबर" भेजा गया है।

यह कम स्पष्ट है कि "t.privateInt" दिखाई देना चाहिए, क्योंकि टी कक्षा परीक्षण का एक अलग उदाहरण है और हम इसके बराबर विधि के अंदर निष्पादित नहीं कर रहे हैं। हालांकि जावा इसकी अनुमति देता है क्योंकि दोनों ऑब्जेक्ट्स (टी और यह) एक ही कक्षा के टेस्ट के हैं और एक-दूसरे के निजी सदस्यों को देख सकते हैं।

+0

ठीक है ... अब मैं समझता हूं ... लेकिन क्यों? जावा ने ऐसा क्यों किया? क्या आप कुछ वास्तविक जीवन उदाहरणों के बारे में सोच सकते हैं। मुझे लगता है कि इसे बराबर में क्यों काम करना चाहिए .. लेकिन एक बेहतर उदाहरण होना चाहिए .. – pek

+0

एकमात्र अन्य उदाहरण बराबर के समान होंगे जहां आपको अपनी कक्षा का एक और उदाहरण तर्क के रूप में दिया जाता है। जावा ने ऐसा क्यों किया, यह ओओ भाषाओं में काफी मानक है - सी ++ वैसे ही काम करता है। C++ == ओवरलोडिंग: http://artis.imag.fr/~Xavier.Decoret/resources/C++/operator==.html –

+0

Soooo ... अपनी सुंदर बेकार सामान्य ज्ञान? – pek

3

आप इसे उसी कक्षा के भीतर से संदर्भित कर रहे हैं। इस प्रकार, आप जानते हैं कि आप क्या कर रहे हैं और खुद से संरक्षित होने की आवश्यकता नहीं है।

4

माइक काफी सही है; आप कक्षाओं के साथ वस्तुओं को भ्रमित कर रहे हैं (कक्षा के उदाहरण)। सदस्य वर्ग के लिए निजी हैं, कक्षा के किसी विशेष उदाहरण नहीं।

मुझे याद है कि जब मैं जावा के लिए नया था तो मुझे आश्चर्य हुआ।

+0

या वह obj_of_same_class.field – Tom

+0

साथ भ्रमित this.field आप शायद थोड़ा और विस्तार से बता या एक लिंक जो मुझे थोड़ा और अधिक समझने में मदद कर सकते हैं प्रदान कर सके है। – pek

+0

मैंने अपना जवाब सुधारने की कोशिश की ... उम्मीद है कि यह मदद करता है –

1

उसी कक्षा के दूसरे उदाहरण के निजी चर का उपयोग किया जा सकता है। ऐसा इसलिए है क्योंकि आप कक्षा के कार्यान्वयन से सीधे निपट रहे हैं, जिसके लिए आपको इसके आंतरिक, 'निजी' चर के बारे में जानना आवश्यक है।

0

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

3

एक बड़ा कारण यह है कि अन्य मामलों की निजी सदस्यों के लिए पहुँच की अनुमति दी है "कॉपी" कार्यों की अनुमति के लिए है - वे अन्यथा काफी असंभव होगा। इसके अलावा, अगर आपने अन्य मामलों से पहुंच की अनुमति नहीं दी है, तो आप स्थिर तरीकों के लिए क्या अनुमति देंगे?

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