2016-04-07 6 views
6

मैं निम्नलिखित कोड कोशिश कर रहा था,क्यों अशक्त काम एक समारोह में काम नहीं कर

public void test() { 
    List<Integer> list = new ArrayList<>(); 
    list.add(100);  
    list.add(89);  
    System.out.println(list); 
    update1(list); 
    System.out.println(list); 
    update2(list); 
    System.out.println(list);  
} 

public void update1(List<Integer> list) { 
    list.remove(0); 
} 

public void update2(List<Integer> list) { 
    list = null; 
} 

मैं निम्नलिखित उत्पादन हो रही है,

[100,89] 
[89] 
[89] 

मेरा प्रश्न है, मैं प्रदान करने में सक्षम नहीं कर रहा हूँ क्यों एक बुलाया समारोह के अंदर शून्य के रूप में सूची?

+0

धन्यवाद @ColonelThirtyTwo हो जाएगा, लेकिन मेरे सवाल अशक्त काम regrading है। मुझे पता है "जावा हमेशा मूल्य से गुजरता है, बिना किसी अपवाद के।" पोस्ट से "http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value" – Kajal

+0

क्या शून्य असाइनमेंट _about_ है? आप बस 'सूची' बिंदुओं को बदल रहे हैं ('शून्य 'के मामले में, यह कुछ भी इंगित नहीं करता है)। –

उत्तर

5

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

एक ही ऑब्जेक्ट को इंगित करने वाली दो संदर्भ प्रतियां।

एक और उदाहरण

public void update2(List<Integer> list) { 
    list = new ArrayList<>(); // The new refrence got assigned to a new object 
    list.add(23); // Add 23 to the new list 
} 

यह ऊपर टुकड़ा होगा पुराने वस्तु को प्रभावित नहीं करते या यह बिल्कुल संदर्भ है।

+0

धन्यवाद आप @ अहमद। अगर हम शून्य के साथ असाइन करते हैं तो "नया संदर्भ असाइन किया जा रहा है" सही? – Kajal

+0

संख्या। जब आप अपडेट 2 (सूची) को "नया संदर्भ कॉपी करते हैं" कहते हैं और जब आप फ़ंक्शन के अंदर सूची = शून्य को कॉल करते हैं तो आप कॉपी किए गए रिफ्रेंस को कुछ भी इंगित करने के लिए बदल रहे हैं। –

+0

ठीक है, अद्यतन 1 (सूची) भी एक "प्रतिलिपि संदर्भ" सही है? तो वास्तविक संदर्भ में परिवर्तन कैसे दिखाई देते हैं। – Kajal

1

संदर्भ, सादे पुराने डेटा प्रकार की तरह, मूल्य द्वारा कार्यों के लिए जावा

में पारित कर रहे हैं update2 सिर्फ स्थानीय पैरामीटर listnull का उल्लेख करता है। यह बदलता है list उस कार्यकर्ता को कॉलर में संदर्भित करता है।

तो update2 एक नो-ऑप है।

update1 उस कार्य को पारित संदर्भ सूची को संशोधित करता है।

0

अधिक स्पष्टीकरण आप भी इस तरह से

List<Integer> list = new ArrayList<>(); 
public void test() { 

    list.add(100);  
    list.add(89);  
    System.out.println(list); 
    update1(list); 
    System.out.println(list); 
    update2(list); 
    System.out.println(list+"not null");  
} 

public void update1(List<Integer> list) { 
    list.remove(0); 
} 

public void update2(List<Integer> list) { 
    this.list = null; 
} 

में की कोशिश कर सकते this keyword Update2 का उपयोग करके() के लिए अशक्त होने की सूची तय करता है।

यहां आउटपुट है।

[100, 89]

[89]

अशक्त अब यह अशक्त

+0

यह .सूची उत्तीर्ण param सूची को अनदेखा कर देगी। – Kajal

+0

यह उल्लेख किया गया है कि यदि आपको सूची को शून्य होने की आवश्यकता है! –

+0

धन्यवाद माणिकांत। लेकिन जब हम शून्य के साथ असाइन करते हैं, तो मैं एक पारित वस्तु के व्यवहार को समझने की कोशिश कर रहा था। – Kajal

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