दिलचस्प पोस्ट
ओरेकल में कॉलमों को अल्पविराम विभाजित किए गए मान को विभाजित करें एंड्रॉइड में अपने आवेदन के मेमोरी उपयोग को कैसे प्राप्त करूं? एपीके हस्ताक्षर हस्ताक्षर कैसे प्राप्त करें? यादृच्छिक संख्याएं जो 100 से जोड़ती हैं: Matlab आर में प्रिंट आउटपुट में दशमलव अंकों की संख्या को नियंत्रित करना GMail PHP API के साथ ईमेल का मुख्य भाग नहीं मिल सकता है गतिशील प्रकार की भाषाएँ बनाम स्थिर प्रकार की भाषाएं जब आवश्यक हो तो विशेषाधिकारों को कैसे बढ़ाएं? पैरामीटर सूची द्वारा मूल्य के आधार पर नहीं अजाक्स प्रसंस्करण में "अमान्य JSON पुरानी" तालिका के ऊपर और नीचे क्षैतिज स्क्रॉलबार एक यूआरएल (रेगेक्स) के हिस्से प्राप्त करना जावास्क्रिप्ट में प्रोटोटाइप विरासत को समझना एंड्रॉइड में विलंब के बाद एक विधि कैसे कॉल करें एक जेफ्रैम को किसी भी बटन के बिना टाइमर का उपयोग करके कॉल करना

क्या मैं जावा में संदर्भ के आधार पर पैरामीटर पास कर सकता हूं?

मुझे C# के ref कीवर्ड के समान सिमेंटिक चाहिए

वेब के समाधान से एकत्रित समाधान "क्या मैं जावा में संदर्भ के आधार पर पैरामीटर पास कर सकता हूं?"

जावा भ्रामक है क्योंकि सब कुछ मूल्य से पारित किया जाता है । हालांकि संदर्भ प्रकार (यानी आदिम प्रकार का कोई पैरामीटर नहीं) के पैरामीटर के लिए यह संदर्भ ही है जिसे मूल्य से पारित किया जाता है, इसलिए यह पास-बाय-संदर्भ (और लोग अक्सर दावा करते हैं कि यह है) लगता है। यह मामला नहीं है, जैसा कि निम्नानुसार दिखाया गया है:

 Object o = "Hello"; mutate(o) System.out.println(o); private void mutate(Object o) { o = "Goodbye"; } //NOT THE SAME o! 

Hello को कंसोल पर प्रिंट करेगा विकल्प यदि आप चाहते हैं कि उपरोक्त कोड को Goodbye प्रिंट करना चाहते हैं तो निम्नानुसार एक स्पष्ट संदर्भ का उपयोग करना है:

 AtomicReference<Object> ref = new AtomicReference<Object>("Hello"); mutate(ref); System.out.println(ref.get()); //Goodbye! private void mutate(AtomicReference<Object> ref) { ref.set("Goodbye"); } 

क्या मैं जावा में संदर्भ के आधार पर पैरामीटर पास कर सकता हूं?

नहीं।

क्यूं कर ? जावा में तरीकों के लिए तर्कों को पास करने का केवल एक ही तरीका है: मान द्वारा।

ध्यान दें:

पुरालेखों के लिए यह समझना आसान है: आपको मूल्य की एक प्रति मिलता है।

अन्य सभी के लिए आप संदर्भ की प्रति प्राप्त करते हैं और इसे मूल्य से गुजरते हुए भी कहा जाता है।

यह इस तस्वीर में है:

यहां छवि विवरण दर्ज करें

जावा में रेफरी के समान भाषा के स्तर पर कुछ भी नहीं है जावा में केवल मूल्य अर्थ से गुजर रहा है

जिज्ञासा की खातिर आप जावा में एक रेफ-टाइप सिमेंटिक को एक अस्थिर वर्ग में अपनी ऑब्जेक्ट लपेट कर सकते हैं:

 public class Ref<T> { private T value; public Ref(T value) { this.value = value; } public T get() { return value; } public void set(T anotherValue) { value = anotherValue; } @Override public String toString() { return value.toString(); } @Override public boolean equals(Object obj) { return value.equals(obj); } @Override public int hashCode() { return value.hashCode(); } } 

परीक्षण का मामला:

 public void changeRef(Ref<String> ref) { ref.set("bbb"); } // ... Ref<String> ref = new Ref<String>("aaa"); changeRef(ref); System.out.println(ref); // prints "bbb" 

"जावा प्रोग्रामिंग भाषा" में जेम्स गोस्लिंग से:

"… जावा में वास्तव में एक पैरामीटर पासिंग मोड है – मूल्य से गुजारें – और वह चीजों को सरल रखता है .."

मुझे नहीं लगता कि आप कर सकते हैं आपका सबसे अच्छा विकल्प हो सकता है कि वह चीज जिसे आप "रेफरी द्वारा" दूसरे वर्ग के उदाहरण पर उत्तीर्ण करना चाहते हैं, और (बाहरी) कक्षा के संदर्भ (मान द्वारा) को पास करना चाहते हैं। मेरा क्या मतलब है अगर आप वह समझ सकें…

अर्थात् आपका तरीका उस ऑब्जेक्ट की आंतरिक स्थिति को बदलता है जिसे पारित किया जाता है, जो फिर कॉलर को दिखाई देता है।

जावा हमेशा मूल्य से पास होता है

जब आप एक आदिम को पास करते हैं, तो यह मूल्य की एक प्रति है, जब आप ऑब्जेक्ट पास करते हैं, तो यह संदर्भ सूचक की एक प्रति है।

एक अन्य विकल्प एक सरणी का उपयोग करना है, जैसे void method(SomeClass[] v) { v[0] = ...; } void method(SomeClass[] v) { v[0] = ...; } लेकिन 1) सरणी को विधि लागू करने से पहले आरंभ किया जाना चाहिए, 2) फिर भी कोई भी इस तरह स्वैप विधि को लागू नहीं कर सकता … इस तरह का उपयोग जेडीके में किया जाता है, जैसे java.util.concurrent.atomic.AtomicMarkableReference.get(boolean[])