2012-05-25 24 views
9
public class program1{ 

    public static void main(String args[]){ 

     java.util.Vector vc=new java.util.Vector(); 

     vc.add("111"); 
     vc.add("222"); 

     functioncall(vc); 

     vc.add("333"); 

     System.out.println(vc); 

    } 

    public static void functioncall(java.util.Vector vc){  

     vc=null;  

    } 
} 

उपरोक्त कार्यक्रम का आउटपुट [111,222,333] है। लेकिन, जब मैं निम्नलिखित प्रोग्राम चलाता हूं तो आउटपुट [333] होता है। उलझन में जब हम एक संदर्भ पारित करते हैं, यह कैसे काम करता है चाहे वह मूल्य द्वारा कॉल या संदर्भ द्वारा कॉल करें? और क्योंउलझन में, क्या जावा ऑब्जेक्ट संदर्भ पारित होने पर संदर्भ द्वारा मूल्य या कॉल द्वारा कॉल का उपयोग करता है?

public class program1{ 

    public static void main(String args[]){ 

     java.util.Vector vc=new java.util.Vector(); 

     vc.add("111"); 
     vc.add("222"); 

     functioncall(vc); 

     vc.add("333"); 

     System.out.println(vc); 

    } 

    public static void functioncall(java.util.Vector vc){ 

     vc.removeAllElements(); 

    } 
} 
+2

नकारात्मक वोट क्यों ?? समझ में नहीं आता .. – user617597

+0

मुझे कोड इंडेंटिंग के उस "कुत्ते के नाश्ते" के लिए डाउन-वोट करने का लुत्फ उठाना पड़ा, लेकिन इसे स्लाइड करने दें। मुझे ** संदेह है ** यह किसी ऐसे व्यक्ति द्वारा डाउन-वोट किया गया था जो महसूस करता है कि कई डुप्लिकेट हैं। बेहतर हिट के लिए दाईं ओर कॉलम में दिखाए गए 'संबंधित' धागे को जांचें [टैग: पास-बाय-रेफरेंस] और [टैग: पास-बाय-वैल्यू] टैग जोड़े गए हैं। –

+2

क्योंकि इसे पहले से ही दस लाख बार पूछा गया है, जो एक खोज इंजन जल्दी से दिखाएगा। अब फिर से अंतहीन बहस होगी, क्योंकि ज्यादातर लोग गलत तरीके से आश्वस्त हैं कि यह संदर्भ द्वारा कॉल किया जाता है। यदि इसे संदर्भ द्वारा कॉल किया गया था तो आपका पहला उदाहरण NullPointerException को फेंक देगा। –

उत्तर

19

यह संदर्भ के मूल्य से गुजरता है।

लापरवाही से एक समानता चोरी करने के लिए मैंने कुछ समय पहले यहां पोस्ट किया था, कल्पना करें कि आपके द्वारा उपयोग किए जाने वाले प्रत्येक पहचानकर्ता पेपर का एक टुकड़ा है जो उस पर लिखा गया है। पता एक घर को इंगित करता है।

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

यदि आप वेक्टर को शून्य पर सेट करते हैं, तो आप जो भी कर रहे हैं वह पता निकाल रहा है।

This article इसे और अधिक विस्तार से समझाता है।

2

जावा ऑब्जेक्ट संदर्भों का उपयोग करता है। तर्क संदर्भ मान है। तो यह मान द्वारा कॉल किया जाता है, जहां मूल्य वस्तुओं के लिए संदर्भ है।

1

वीसी एक नया चर है जिसमें वेक्टर का संदर्भ शामिल है जिसका उपयोग विधि को कॉल करने के लिए किया गया था। इसे शून्य में बदलना मूल वेक्टर को प्रभावित नहीं करता है क्योंकि यह संदर्भ मूल वेक्टर संदर्भ की प्रति है।

लेकिन चूंकि यह मूल वेक्टर का संदर्भ है क्योंकि वेक्टर में कोई भी संशोधन वास्तव में मूल वेक्टर को बदलता है। तो जावा हमेशा मूल्य से कॉल का उपयोग करता है, यहां मान एक संदर्भ होता है।

2

आप एक संदर्भ प्रति (हमेशा) के रूप में वीसी पास करते हैं। फिर vc = null; या vc = new Vector() कर रहे हैं, तो आप केवल वीसी स्थानीय विशेषता से संदर्भ संशोधित करते हैं और इसलिए यह सामान्य है कि मुख्य व्यक्ति नहीं बदला।

0

जावा "संदर्भ द्वारा पास करें" के साथ, संदर्भ स्वयं मान द्वारा पारित किया जाता है।

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

तो removeAll कॉल Vector पर कार्य करता है ताकि आप परिणाम देख सकें। लेकिन यदि आप को बदलने के संदर्भ में ही की तरह:

vc = null 

या,

vc = new Vector(); 
ये वे परिवर्तन

, एक नया (या नल) वस्तु को इंगित ताकि बाद में कोई भी परिवर्तन में वस्तु में दिखाई नहीं देंगे main

+0

"संदर्भ के अनुसार किसी भी पास के साथ सामान्य रूप से ..." ऐसा नहीं है कि "पास-बाय-रेफरेंस" का अर्थ क्या है। यह पास-दर-मूल्य है। सही पास-दर-संदर्भ में, उदा। सी ++ में, आप एक चर को फ़ंक्शन में पास कर सकते हैं, और फ़ंक्शन उस चर को असाइन कर सकता है * जैसे कि * इसे कॉलिंग स्कोप में असाइन किया गया था। संदर्भ के साथ यह "हमेशा की तरह" है, और जावा में संभव नहीं है। – user102008

+0

@ user102008 ठीक है .. मैंने इसे संपादित किया। तुम सही हो .. मेरा जवाब सुना जैसे मैं सभी भाषाओं के बारे में बात कर रहा था। – Chip

2

यह मूल्य द्वारा कॉल किया जाता है। दोनों मामलों में आप विधि के तर्क में संदर्भ के संदर्भ में मान डालते हैं जो स्थानीय विधि का संदर्भ है।

0

जावा "वैल्यू अवधारणा द्वारा कॉल" के साथ काम करता है।यदि इसका ढेर और ढेर दृश्यमान है तो जावा स्थानीय कार्यक्षेत्र में किसी भी चर के मानों को खोजने का प्रयास करता है, अगर यह स्थानीय में नहीं मिलता है तो यह ढेर में मौजूद वस्तु में पता लगाने की कोशिश करता है।

उदाहरण

class Foo 
{ 

int x; 

public void call(int x) 

{ 

    x++; 

} 

public static void main(String[] args) 

{ 

     Foo foo = new Foo(); 

     foo.x = 5; 

     System.out.println(foo.x); 

     foo.call(foo.x); 

     System.out.println(foo.x); 


} 


} 

उपरोक्त कार्यक्रम के उत्पादन होगा: 5, 5 Desciption: मुख्य विधि में, एक्स का मान "foo के संदर्भ पर असाइन किया गया है 5: कॉल विधि में, वहाँ वर्कस्पेस में "x" (तर्क के रूप में पारित) नामक स्थानीय चर है। इसलिए यह मान केवल अपने कार्यक्षेत्र में बदला जाएगा। जब इस फ़ंक्शन से नियंत्रण मुख्य विधि पर वापस आ जाता है। मुख्य में "x" का वर्कस्पेस मान अभी भी 5.

है

उदाहरण

class Foo 

{ 

int x; 

public void call(int y) 

{ 

    x++; 

} 

public static void main(String[] args) 

{ 

     Foo foo = new Foo(); 

     foo.x = 5; 

     System.out.println(foo.x); 

     foo.call(foo.x); 

     System.out.println(foo.x); 

} 


} 

उपरोक्त कार्यक्रम के उत्पादन होगा: 5, 6

Desciption: मुख्य विधि में, एक्स का मान "foo के संदर्भ पर असाइन किया गया है 5: कॉल विधि में , वर्कस्पेस में "x" नामक कोई स्थानीय चर नहीं है (तर्क के रूप में पारित)। तो जावा इसे संदर्भ में पाता है जिसके माध्यम से "कॉल" फ़ंक्शन कहा जाता था और "x" का मान 5 होता है, कॉल विधि "6" पर अपना मान बढ़ाती है, इसलिए इसका मान संदर्भित किया जाएगा i.e. "foo"। जब इस समारोह से नियंत्रण मुख्य विधि पर वापस आ जाता है। अब "x" के मुख्य कार्यक्षेत्र मान में 6 है क्योंकि यहां हमने foo संदर्भ पर "x" मुद्रित किया है।

मुझे आशा है कि इससे आपकी अवधारणाओं को दूर करने में आपकी मदद मिलेगी।

सादर, सुशील जैन

1

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

  • जावा आदिम प्रकार
  • जावा वस्तु का संदर्भ

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

निम्नलिखित लेख अच्छी तरह से Call by value and call by reference बताते हैं।

0

दर्रा-दर-मूल्य

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

पास-दर-संदर्भ औपचारिक पैरामीटर वास्तविक पैरामीटर के लिए केवल उपनाम के रूप में कार्य करता है। कभी भी विधि/फ़ंक्शन औपचारिक पैरामीटर (पढ़ने या लिखने के लिए) का उपयोग करता है, यह वास्तव में वास्तविक पैरामीटर का उपयोग कर रहा है। जावा है सख्ती से पारित-दर-मूल्य

1

जावा और सी हमेशा मूल्य से कहते हैं। संदर्भ द्वारा कॉल शब्द कड़ाई से सी ++ पर लागू होता है जहां हम औपचारिक तर्क में & ऑपरेटर का उपयोग करते हैं। ऑब्जेक्ट संदर्भों के मामले में संदर्भ वास्तविक से औपचारिक तर्क के लिए प्रतिलिपि बनाई गई हैं।

1

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

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

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