2011-08-03 18 views
9

हम यहां सूचक का उपयोग क्यों नहीं कर रहे हैं?हम जावा में पॉइंटर्स का उपयोग क्यों नहीं कर सकते?

जावा में पॉइंटर के बजाय कौन सी अवधारणा का उपयोग किया जाता है?

+1

कृपया देखें http://stackoverflow.com/questions/2629357/does-java-have-pointers – nidhin

+0

क्या आपका मतलब सी स्टाइल मेमोरी एड्रेस पॉइंटर्स है? या सामान्य अर्थ में पॉइंटर्स? –

+0

"संदर्भ" पॉइंटर्स हैं। वे सिर्फ "संरक्षित" पॉइंटर्स हैं, जिसका अर्थ है कि आप अपने आंतरिक मूल्यों में हेरफेर नहीं कर सकते हैं। –

उत्तर

21

हम जावा में पॉइंटर्स का उपयोग क्यों नहीं कर सकते?

क्योंकि भाषा डिजाइनरों भाषा में संकेत शामिल करने के लिए नहीं चुना है।

हम यहां सूचक का उपयोग क्यों नहीं कर रहे हैं।

क्योंकि जावा के डिजाइनरों सोचा था कि यह था एक मुश्किल से उपयोग और त्रुटि प्रवण निर्माण।

जावा में पॉइंटर के बजाय कौन सी अवधारणा का उपयोग किया जाता है?

संदर्भ (जो काफी संकेत के समान हैं अगर आप सूचक अंकगणित से उपेक्षा)।

ध्यान रखें कि आपके द्वारा बनाई गई सभी ऑब्जेक्ट्स, आप ढेर पर बनाते हैं (new कीवर्ड का उपयोग करके)। इस तथ्य के साथ, इस तथ्य के साथ कि कोई "dereference ऑपरेटर" नहीं है (* सी/सी ++ में) का अर्थ है कि किसी ऑब्जेक्ट को पकड़ने का कोई तरीका नहीं है! चूंकि आप किसी ऑब्जेक्ट को पकड़ नहीं सकते हैं, इसलिए कोई ऑब्जेक्ट किसी ऑब्जेक्ट को एक चर में स्टोर नहीं कर सकता है। सभी चर के लिए (आदिम प्रकार वाले वाले को छोड़कर) संदर्भ-प्रकार के हैं।

0

जावा में किसी साधारण प्रकार का कोई संदर्भ हमेशा मूल्य से होता है और किसी ऑब्जेक्ट में किसी ऑब्जेक्ट पर हमेशा विशेष ऑब्जेक्ट्स के मामलों को छोड़कर एक पॉइंटर होता है।

10

यह एक भाषा डिजाइन निर्णय था।

सूरज श्वेत पत्र The Java Language Environment से:

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

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

-1

प्रत्येक वस्तु जिसे आप new() का उपयोग करके बनाते हैं; वास्तव में सूचक है ..

XXX a=new XXX(); 

a वास्तव में एक सूचक है .. यह आप जैसे आप सी में (सुरक्षा कारणों से) कर सकते हैं उन्हें सूचक अंकगणित की तरह कल्पना बात नहीं कर सकते है।

तो वास्तव में यदि आप किसी ऑब्जेक्ट को पास कर रहे हैं, तो आप ऑब्जेक्ट पर पॉइंटर पास कर रहे हैं (new() द्वारा निर्मित ऑब्जेक्ट ढेर में रहता है)।

2

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

+0

सी पॉइंटर्स सरल हैं और जब सही, बहुत शक्तिशाली उपयोग किया जाता है। कोई जादू नहीं है, यह बाइट्स की पूर्वनिर्धारित संख्या के पते पर इंगित करता है। – Will03uk

+0

मैं सहमत हूं, लेकिन जावा में सी स्टाइल पॉइंटर्स नहीं हैं, है ना? इससे कोई फर्क नहीं पड़ता कि वे कितने सरल हैं, यह बिल्कुल सही है कि जावा उनका उपयोग नहीं करता है। क्या आप विल से सहमत होंगे? –

+1

हां; एक टिप्पणी भाषा होने के नाते, जावा की बावजूद मेरी टिप्पणी अधिक थी। स्पष्ट रूप से जेवीएम को जावा अवधारणा को फिट करना है, मेरा मानना ​​है कि सी/सी ++ एक अच्छी तरह से निर्मित, विविध पुस्तकालय जैसे कि क्यूटी – Will03uk

1

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

वास्तव में एक और पुस्तक "द जावा वर्चुअल मशीन" कहती है: "एक संदर्भ पॉइंटर्स की एक जोड़ी के लिए एक सूचक है; दो पॉइंटर्स में से एक पॉइंटर्स को इंगित करता है [...]"।

जावा संदर्भ और सी पॉइंटर्स के बीच अंतर भिन्न हैं लेकिन फिर भी संदर्भ पॉइंटर्स हैं।

+1

के साथ जावा के रूप में उपयोग करना आसान हो सकता है, पॉइंटर्स संदर्भ से अलग हैं जिसमें आप पॉइंटर अंकगणित और संदर्भ कर सकते हैं वास्तविक स्मृति को इंगित न करें। JVM सभी को संभालता है। वे सिर्फ ऑब्जेक्ट को इंगित करते हैं, जो कचरा संग्रह के दौरान घूम सकता है। इसके अलावा, इस सवाल को एक साल पहले पूछा गया था, इसलिए यह असंभव है कि आपको कोई ई-मेल प्राप्त होगा। मैं इसे देखने के लिए ई-मेल कटाई के लिए अपना ई-मेल डालने की अनुशंसा नहीं करता। आपको बहुत सारे स्पैम मिलेंगे। खैर, आपके पास याहू है! मेल, तो पहले से ही बहुत कुछ मिलता है। (मैंने एक याहू खाता खोल लिया, और कभी इसका इस्तेमाल नहीं किया। मैं इसे वापस चला गया, एक बार, और यह स्पैम से भरा था।) – eboix

-1

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

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

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

यह लचीलापन दूर करने के लिए नज़दीकी ध्यान देने की मांग करता है ऐलिस और कोई अवरुद्ध डिबगिंग नहीं रखता है।

+1

सवाल जावा के बारे में था। आप सी के बारे में क्यों बात कर रहे हैं? –

+0

मैं जेसी से सहमत हूं, सवाल जावा के बारे में है, लेकिन आप इसके बजाय सी प्रोग्रामिंग भाषा का उल्लेख करते हैं। – Alex

0

आप java.misc.unsafe का उपयोग कर पॉइंटर यांत्रिकी तक पहुंच सकते हैं, लेकिन यह है ... mmm ... असुरक्षित

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

0

जावा के सिद्धांत का पालन करता है द्वारा कॉल करें। तो यदि आप कोई ऑब्जेक्ट बनाते हैं, तो आप ढेर स्पेस में बनाए गए ऑब्जेक्ट के संदर्भ की एक प्रति वापस प्राप्त करेंगे। संदर्भ की यह प्रति एक चर को असाइन किया जाता है। यदि आप इस चर का उपयोग विधि कॉल के लिए तर्क के रूप में करते हैं, तो उस संदर्भ की एक प्रति बनाई गई है और इसके बजाय उपयोग की जाती है। जावा संदर्भ या पॉइंटर्स का कभी भी उपयोग नहीं करता है! जावा में सब कुछ एक प्रति है। इसलिए जावा call by value सिद्धांत का पालन करता है।

0

किसी प्रोग्रामिंग भाषा में हेरफेर करने की सबसे कठिन बात पॉइंटर्स के साथ है। यदि आप बस कुछ याद करते हैं तो आपको कई त्रुटियां मिलती हैं अर्थात् सेगमेंटेशन दोष। जावा ऐसी एक भाषा है जो उपयोगकर्ताओं को कॉल द्वारा VALUE का उपयोग करके चीजों को करने में लचीलापन प्रदान करती है।

+0

यह उत्तर बहुत व्यापक नहीं है। अपने ज्ञान को अन्य विस्तृत पदों पर टिप्पणी के रूप में जोड़ने पर विचार करें जबतक कि आपको लगता है कि आपका उत्तर पूरी तरह से प्रश्न का उत्तर नहीं देता है। –

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