2010-11-17 7 views
10

मेरे पास ऐसा फ़ंक्शन है जो उपयोगकर्ता द्वारा परिभाषित ऑब्जेक्ट देता है। सबसे पहले मैं जानना चाहता हूं कि उस वस्तु को संदर्भ द्वारा वापस किया गया है और क्या होगा यदि यह निजी था?जावा (शुरुआती): किसी ऑब्जेक्ट को वापस करना? क्या यह निरंतर संदर्भ के रूप में लौटाया गया है या क्या?

इसके अलावा, मैं इसे कॉन्स्टेंट (अंतिम) संदर्भ के रूप में कैसे वापस कर सकता हूं क्योंकि मैं नहीं चाहता कि कोई इसके साथ गड़बड़ करे? मैं ऑब्जेक्ट लौटने और object.copy() लौटने के बीच इतना उलझन में हूं; या object.clone();

उत्तर

13

जावा में, तुम हमेशा एक संदर्भ वापसी (जब तक दिए गए मान एक आदिम प्रकार है इस तरह के int, float, char के रूप में, ...)।

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

+5

... या ऑब्जेक्ट को अपरिवर्तनीय बनाने के लिए डिज़ाइन किया गया है। –

+0

@ माइकल बोर्गवर्ड: महान बिंदु। मुझे लगता है कि इसे उत्तर में जोड़ने से सवाल पूछने वाले व्यक्ति को भ्रमित कर दिया जाएगा ... –

+0

संदर्भ द्वारा पारित एक सरणी है? जहां तक ​​मुझे पता है, यह एक प्राचीन प्रकार है, लेकिन यह उत्परिवर्तनीय है। – bigblind

1

यह ऑब्जेक्ट का संदर्भ देता है।

मान लीजिए कि आपके पास एक विधि कॉल है।

Object obj = makeObject(); 
जो एक वस्तु और रिटर्न (जो makeObject विधि में बनाया वस्तु के संदर्भ है) बनाता है

0

1) हां, यह ऑब्जेक्ट का संदर्भ देता है।

2) यदि विधि निजी है, तो इसे केवल कक्षा के भीतर से ही बुलाया जा सकता है।

3) ऑब्जेक्ट बनाना final दूसरों को इस पर विधियों को कॉल करने से नहीं रोकता है। पैकेज और विधि दृश्यता का उपयोग करके ऑब्जेक्ट को अपरिवर्तनीय बनाने के तरीके हैं। (लुक अप कैसे सार्वजनिक, संरक्षित, और निजी काम)

4) कोई Object.copy()

5) Object.clone() एक गंदा जानवर है।

9

तो, अपने सवालों के जवाब देने के लिए आपको सबसे पहले यह पता होना चाहिए कि जावा वेरिएबल्स कैसे पास करता है। जबकि चर पी बनाई व्यक्ति की स्मृति पता होता है,

int i = 1234; 
Person p = new Person("Peter"); 

अब, चर मैं वास्तव में 1234 में शामिल हैं:

एक चर एक मूल्य है।

इसलिए मेरे पास 1234 है और पी में एड्रेस है (चलिए ए 4 डीएफआई 3 कहें)।

anyMethodYouLike(p); 
System.out.println(p.getName()); 
public void anyMethodYouLike(Person somePerson) { 
    somePerson.rename("Homer"); 
} 

इसलिए इस उदाहरण में, हम विधि को किसी भी विधि देते हैं जैसे वे परिवर्तनीय पी ... प्रतीक्षा करें! हम विधि को वेरिएबल (a4dfi3) का मान देते हैं। विधि फिर इस वैरिएबल पर नाम बदलती है (जिसमें अभी भी पी के समान एड्रेस है, इसलिए यह उसी व्यक्ति को संशोधित करता है जो पी पॉइंट्स को इंगित करता है)। तो, विधि के बाद, व्यक्ति का नाम पी इंगित करता है, मुद्रित हो जाता है, जिसके परिणामस्वरूप "होमर" होता है।

someOtherMethod(p); 
System.out.println(p.getName()); 
public void someOtherMethod(Person somePerson) { 
    somePerson = new Person("Walter"); 
} 

इस उदाहरण में हम अभी भी विधि के लिए "पीटर" नामक हमारे व्यक्ति का पता लगाते हैं। लेकिन इस बार, विधि कुछ पर्सन में एक नया व्यक्ति बनाती है (इसलिए कुछ पर्सन में एड्रेस को ओवरराइड करना .. चलिए 13n37s कहें। लेकिन!A4dfi3 पर व्यक्ति बदला नहीं गया था! प्रिंट कॉल अभी भी "पीटर" आउटपुट करता है और "वाल्टर" नहीं।

अब, चलो देखते हैं कि यह कैसे पुरातन साथ बर्ताव करते हैं:

someMethod(i); 
System.out.println(i); 
public void someMethod(int someInt) { 
    someInt++; 
} 

तो, मैं के मूल्य (1234) someInteger के लिए पारित हो जाता है। फिर कुछ इंटेगर 1235 तक बढ़ जाता है। लेकिन मैं अभी भी 1234 है।

जावा में ऑब्जेक्ट्स और प्राइमेटिव्स के बीच यह बड़ा अंतर है।

अब आपके प्रश्नों के लिए: 1. जैसा कि आप यहां पढ़ सकते हैं, हाँ जावा हमेशा ऑब्जेक्ट के संदर्भ एड्रेस को पास करता है। 2. यदि आप नहीं चाहते हैं कि किसी को आपके ऑब्जेक्ट्स के मूल्यों से गड़बड़ हो, तो आपको पहले उस जानकारी के साथ एक नया ऑब्जेक्ट बनाना होगा (उदाहरण के लिए क्लोनेबल और क्लोन()), लेकिन यह एक वास्तविक गड़बड़ है क्योंकि आपको बनाना है निश्चित रूप से, कि आपके ऑब्जेक्ट में जो कुछ भी प्राचीन नहीं है, वह फिर से बनाया जाता है, जो आपके ऑब्जेक्ट्स के विशाल पेड़-संरचनाओं में बहुत भयानक होता है।

मुझे आशा है कि मैं मदद कर सकता है, Ferdi265

2

क्या तुम सच में एहसास होना चाहिए "गुजर" या "लौटने" के बारे में कुछ खास नहीं है कि वहाँ है। जब भी आप कुछ "पास" या "वापसी" करते हैं, तो यह केवल चीज़ के मूल्य को पास करता है। अवधि। किसी भी प्रकार के लिए। जब भी आप कुछ "पास" या "वापसी" करते हैं, तो यह बिल्कुल वैरिएबल को असाइन करने जैसा ही होता है।

हालांकि, क्या आप जिस चीज को पार कर रहे हैं या लौट रहे हैं उसका मूल्य क्या है? यही वह जगह है जहां आपका भ्रम झूठ बोलता है। आपका प्रश्न "ऑब्जेक्ट लौटने" के बारे में पूछता है; हालांकि, ऐसी चीज जावा में समझ में नहीं आता है। वस्तुओं जावा में मूल्य नहीं हैं। एक वैरिएबल होना असंभव है जिसका मूल्य एक वस्तु है।

जावा में एकमात्र प्रकार आदिम प्रकार और संदर्भ प्रकार हैं। इसलिए केवल मूल्य प्राइमेटिव्स और संदर्भ हैं। (संदर्भ ऑब्जेक्ट्स के पॉइंटर्स हैं।) जावा में, हम केवल संदर्भों (ऑब्जेक्ट्स के पॉइंटर्स) के माध्यम से ऑब्जेक्ट्स में हेरफेर करते हैं। हम किसी ऑब्जेक्ट को एक चर में स्टोर नहीं कर सकते; लेकिन हम एक चर में एक संदर्भ (एक वस्तु के लिए सूचक) स्टोर कर सकते हैं। तो जब आप वस्तुओं को गुजरने या वापस करने के बारे में बात करते हैं, तो आप लगभग निश्चित रूप से संदर्भों को पार करने या वापस करने के बारे में बात करते हैं। और, जैसा कि पहले कहा गया है, संदर्भों को पास करने या वापस करने के बारे में कुछ खास नहीं है - संदर्भ का मूल्य (एक सूचक) पास या वापस कर दिया जाता है।

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