2010-05-05 5 views
10

एक कक्षा में, मेरे पास है:प्रतिलिपि बनाने के बजाय ऑब्जेक्ट को इंगित करने के लिए जावा असाइनमेंट कैसे किया जा सकता है?

private Foo bar; 
public Constructor(Foo bar) 
{ 
    this.bar = bar; 
} 

इसके बजाय पैरामीटर में प्रदान की वस्तु से बार की एक प्रति बनाने के बजाय, यह निर्माता में बार ऐसी है कि करने के लिए एक सूचक शामिल करने के लिए संभव है मूल बार परिवर्तन बदल रहा है इस वस्तु में क्षेत्र?

डालने का एक और तरीका:

int x = 7; 
int y = x; 
x = 9; 
System.out.print(y); //Prints 7. 

यह इतना है कि मुद्रण y प्रिंट 9 के बजाय 7 सेट करने के लिए संभव है?

उत्तर

8

आपका अंतिम उदाहरण इस तरह से काम करता है क्योंकि int एक आदिम है, यह मूल्य द्वारा प्रतिलिपि बनाई गई है। पहले उदाहरण में, "this.bar" संदर्भ (सूचक की तरह) की एक प्रति बार को पकड़ जाएगा। तो यदि आप मूल बार (आंतरिक रूप से) बदलते हैं, तो परिवर्तन आपकी कक्षा में दिखाई देगा। कोशिश करो।

+1

"पूर्णांक एक आदिम है, यह मूल्य से कॉपी किया जाता है है" थोड़ी अधिक हो सकती भ्रामक। संदर्भ भी मूल्य द्वारा प्रतिलिपि बनाई गई हैं। – aioobe

+2

हां। लेकिन पोस्टर वस्तुओं की अवधि में सोच रहा था। यह समझना महत्वपूर्ण है- शुरू करने के लिए- उन वस्तुओं (विपरीत रूप से सी ++) को मूल्य द्वारा प्रतिलिपि नहीं बनाई जाती है। – leonbloy

16

जब किसी चर को किसी विधि के लिए तर्क के रूप में उपयोग किया जाता है, तो यह सामग्री हमेशा कॉपी की जाती है। (जावा में केवलcall-by-value है।) यहां समझना महत्वपूर्ण है, कि आप केवल संदर्भों के माध्यम से वस्तुओं का संदर्भ ले सकते हैं। तो वास्तव में क्या होता है जब आप किसी ऑब्जेक्ट का संदर्भ देने वाले चर को पास करते हैं, तो यह है कि आप ऑब्जेक्ट (मान द्वारा!) को संदर्भित करते हैं।

कोई आपको बता सकता है कि "प्राइमेटिव्स मूल्य से गुजर चुके हैं" और "गैर प्राइमेटिव्स संदर्भ द्वारा पारित किए जाते हैं", लेकिन यह केवल इसलिए है क्योंकि एक चर के साथ किसी ऑब्जेक्ट का संदर्भ केवल किसी ऑब्जेक्ट का संदर्भ नहीं हो सकता है। जब कोई इसे समझता है, तो वह इस बात से सहमत होगा कि वस्तुओं का जिक्र करने वाले चर भी मूल्य से गुजरते हैं।

Is Java "pass-by-reference" or "pass-by-value"?

से जावा हमेशा होता है पारित-दर-मूल्य। मुश्किल बात यह समझने के लिए हो सकती है कि जावा वस्तुओं को मूल्य से पारित संदर्भों के रूप में पास करता है।

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html से

जावा संदर्भ द्वारा वस्तुओं में हेरफेर करता है, और सभी वस्तु चर संदर्भ हैं। हालांकि, जावा संदर्भ द्वारा विधि तर्क पास नहीं करता है; यह उन्हें मूल्य से गुजरता है।

जावा में, प्राइमेटिव्स के लिए सी ++ "संदर्भ प्रकार" में कोई काउंटर हिस्सा नहीं है।

+1

पहला वाक्य सही है, लेकिन जावा पर आने वाले कई लोगों के लिए भ्रामक हो सकता है कि "चर एक वस्तु है" (जब वास्तव में एक चर एक वस्तु का संदर्भ होता है - एक आदिम)। सबसे पहले शुरुआत करने वाले को यह समझना चाहिए कि तर्क के रूप में पारित होने पर ऑब्जेक्ट को कभी कॉपी नहीं किया जाता है। – leonbloy

0

सदस्य बार के मूल मूल्य को रखने के लिए, आपको क्लोनेबल इंटरफ़ेस को लागू करने की आवश्यकता होगी। फिर ऑब्जेक्ट को नया मान निर्दिष्ट करने से पहले, आपको इसका क्लोन बनाना होगा और क्लोन वैल्यू पास करना होगा और क्लोन ऑब्जेक्ट को नए मान असाइन करना होगा। http://www.java-tips.org/java-se-tips/java.lang/how-to-implement-cloneable-interface.html पर इसे कैसे करें इस पर एक ट्यूटोरियल है।

1

जावा कभी वस्तुओं की प्रतिलिपि नहीं करता है। प्रत्येक "नए" के संदर्भ में सोचना सबसे आसान है, आपके पास एक ऑब्जेक्ट उदाहरण होगा - कभी और नहीं।

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

तो जावा काम करने के लिए अपना पहला उदाहरण वैसे ही काम करता है, और यह ओओ डिजाइन का मुख्य हिस्सा है - तथ्य यह है कि एक बार जब आप किसी ऑब्जेक्ट को तुरंत चालू कर देते हैं, तो इसका उपयोग करने वाले सभी के लिए यह वही वस्तु है।

प्राइमेटिव्स और संदर्भों से निपटना थोड़ा अलग है - क्योंकि वे ऑब्जेक्ट्स नहीं हैं, उनकी हमेशा प्रतिलिपि बनाई जाती है - लेकिन शुद्ध प्रभाव यह है कि जावा हमेशा ऐसा करने के बारे में होता है जिसे आप अतिरिक्त वाक्यविन्यास या भ्रमित किए बिना करना चाहते हैं विकल्प।

3

कि व्यवहार आप एक वस्तु के एक सदस्य को संशोधित कर सकता है पाने के लिए:

public class Number{ 
    int value; 
    Number(int value){ 
    this.value = value; 
    } 
    public String toString() { 
    return "" + value; 
    } 
} 

फिर आप कर सकता है:

Number x = new Number(7); 
Number y = x; 
x.value = 9; 
System.out.println(y);//prints 9 
संबंधित मुद्दे

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