दिलचस्प पोस्ट
कैसे favicon.ico अनुरोधों को रोकने के लिए? सी # में निलंबित प्रक्रिया एक जावा कार्यक्रम को निष्पादन योग्य में संकलित करना वर्तमान मेनू आइटम को कैसे उजागर करें? एंड्रॉइड – @ ड्रॉएबल स्ट्रिंग से ओपन संसाधन NSAttributed स्ट्रिंग से UIImage निकालें आईओएस सेटिंग्स बंडल में लाइसेंस अनुभाग जोड़ने का सर्वोत्तम तरीका शामिल करते समय 2100 पैरामीटर सीमा (SQL सर्वर) को मारना नेविगेशन नियंत्रक पर पारदर्शी मोडल देखें कैसे एक स्ट्रिंग एक स्ट्रिंग के साथ शुरू होता है की जाँच करने के लिए? सी # का उपयोग करते हुए Excel फ़ाइल के डेटा को कैसे पढ़ें? रेल पर रूबी: वैश्विक स्थिरांक को परिभाषित करने के लिए कहां? इकाई फ़्रेमवर्क बहुत धीमा है मेरे विकल्प क्या हैं? महीना वर्ष दिखाने के लिए केवल jQuery UI DatePicker उनकी छवियों के साथ इमोटिकॉन की सूची बदलें

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

मुझे पता है कि जावा में संकेत नहीं है, लेकिन मैंने सुना है कि जावा प्रोग्राम पॉइंटर्स के साथ बनाया जा सकता है और यह कुछ ऐसे लोगों द्वारा किया जा सकता है जो जावा में विशेषज्ञ हैं। क्या यह सच है?

वेब के समाधान से एकत्रित समाधान "मैं जावा में पॉइंटर्स का उपयोग कैसे कर सकता हूं?"

जावा में सभी ऑब्जेक्ट संदर्भ हैं और आप उन्हें पॉइंटर्स जैसे उपयोग कर सकते हैं।

abstract class Animal {... } class Lion extends Animal {... } class Tiger extends Animal { public Tiger() {...} public void growl(){...} } Tiger first = null; Tiger second = new Tiger(); Tiger third; 

एक रिक्त स्थान की व्याख्या करना:

 first.growl(); // ERROR, first is null. third.growl(); // ERROR, third has not been initialized. 

अलियालीकरण समस्या:

 third = new Tiger(); first = third; 

खोने वाली कोशिकाओं:

 second = third; // Possible ERROR. The old value of second is lost. 

आप पहले यह आश्वस्त करके यह सुरक्षित कर सकते हैं कि दूसरे के पुराने मूल्य की कोई और जरूरत नहीं है या दूसरे सूचक को दूसरे के मूल्य को निर्दिष्ट करने की आवश्यकता है।

 first = second; second = third; //OK 

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

जब आप नए कॉल करते हैं और आवंटन अनुरोधित सेल आवंटित नहीं कर सकता, तो जावा सिस्टम एक अपवाद फेंकता ( OutOfMemoryError ) करेगा। यह बहुत दुर्लभ है और आम तौर पर रन-दूर पुनरावर्ती से परिणाम होता है।

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

Novices अक्सर निम्न त्रुटि करते हैं

 Tiger tony = new Tiger(); tony = third; // Error, the new object allocated above is reclaimed. 

आप शायद कहने का मतलब क्या था:

 Tiger tony = null; tony = third; // OK. 

अनुचित कास्टिंग:

 Lion leo = new Lion(); Tiger tony = (Tiger)leo; // Always illegal and caught by compiler. Animal whatever = new Lion(); // Legal. Tiger tony = (Tiger)whatever; // Illegal, just as in previous example. Lion leo = (Lion)whatever; // Legal, object whatever really is a Lion. 

सी में संकेतक:

 void main() { int* x; // Allocate the pointers x and y int* y; // (but not the pointees) x = malloc(sizeof(int)); // Allocate an int pointee, // and set x to point to it *x = 42; // Dereference x to store 42 in its pointee *y = 13; // CRASH -- y does not have a pointee yet y = x; // Pointer assignment sets y to point to x's pointee *y = 13; // Dereference y to store 13 in its (shared) pointee } 

जावा में संकेतक:

 class IntObj { public int value; } public class Binky() { public static void main(String[] args) { IntObj x; // Allocate the pointers x and y IntObj y; // (but not the IntObj pointees) x = new IntObj(); // Allocate an IntObj pointee // and set x to point to it x.value = 42; // Dereference x to store 42 in its pointee y.value = 13; // CRASH -- y does not have a pointee yet y = x; // Pointer assignment sets y to point to x's pointee y.value = 13; // Deference y to store 13 in its (shared) pointee } } 

अद्यतन: जैसा कि टिप्पणियों में सुझाव दिया गया है, यह ध्यान रखना चाहिए कि सी सूचक अंकगणितीय है। हालांकि, हमारे पास जावा में ऐसा नहीं है

जावा में पॉइंटर्स हैं जब भी आप जावा में एक ऑब्जेक्ट बनाते हैं, आप वास्तव में ऑब्जेक्ट के लिए एक सूचक बनाते हैं; इस सूचक को फिर एक अलग ऑब्जेक्ट या null करने के लिए सेट किया जा सकता है, और मूल ऑब्जेक्ट अभी भी मौजूद होगा (लंबित कूड़ा संग्रह)।

जावा में आप जो नहीं कर सकते वह पॉइंटर अंकगणितीय है। आप किसी विशिष्ट मेमोरी एड को डिफरेंस नहीं कर सकते हैं या एक पॉइंटर को बढ़ा सकते हैं।

यदि आप वास्तव में निम्न-स्तर प्राप्त करना चाहते हैं, तो ऐसा करने का एकमात्र तरीका जावा मूल इंटरफ़ेस के साथ है ; और फिर भी, निम्न स्तर का हिस्सा सी या सी ++ में किया जाना चाहिए।

जैसा कि जावा में कोई सूचक डेटा प्रकार नहीं है, जावा में पॉइंटर्स का उपयोग करना असंभव है। यहां तक ​​कि कुछ विशेषज्ञ जावा में पॉइंटर्स का उपयोग करने में सक्षम नहीं होंगे।

इसमें अंतिम बिंदु भी देखें: जावा भाषा पर्यावरण

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

आप असुरक्षित वर्ग के उपयोग के पते और संकेतक का उपयोग कर सकते हैं। हालांकि, जैसा कि नाम से पता चलता है, इन तरीकों में असैस और आम तौर पर एक बुरा विचार है। गलत इस्तेमाल के परिणामस्वरूप आपका जेवीएम बेतरतीब ढंग से मर सकता है (वास्तव में एक ही समस्या को सी / सी ++ में ग़लत ढंग से संकेत प्राप्त करना)

जबकि आप पॉइंटर्स के लिए इस्तेमाल किया जा सकता है और आपको लगता है कि आपको उनकी ज़रूरत है (क्योंकि आपको किसी अन्य तरीके से कोड करने का तरीका पता नहीं है), आप पाएंगे कि आप नहीं करते हैं और आप इसके लिए बेहतर होंगे।

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

 import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main(String[] args) throws java.lang.Exception { System.out.println("Expected # = 0 1 2 2 1"); Cat c = new Cat(); c.setClaws(0); System.out.println("Initial value is " + c.getClaws()); // prints 0 obviously clawsAreOne(c); System.out.println("Accessor changes value to " + c.getClaws()); // prints 1 because the value 'referenced' by the 'pointer' is changed using an accessor. makeNewCat(c); System.out.println("Final value is " + c.getClaws()); // prints 1 because the pointer is not changed to 'kitten'; that would be a reference pass. } public static void clawsAreOne(Cat kitty) { kitty.setClaws(1); } public static void makeNewCat(Cat kitty) { Cat kitten = new Cat(); kitten.setClaws(2); kitty = kitten; System.out.println("Value in makeNewCat scope of kitten " + kitten.getClaws()); //Prints 2. the value pointed to by 'kitten' is 2 System.out.println("Value in makeNewcat scope of kitty " + kitty.getClaws()); //Prints 2. The local copy is being used within the scope of this method. } } class Cat { private int claws; public void setClaws(int i) { claws = i; } public int getClaws() { return claws; } } 

यह Ideone.com पर चलाया जा सकता है

जावा में सभी ऑब्जेक्ट प्राइमेटिव्स को छोड़कर संदर्भ कॉपी द्वारा कार्य करने के लिए पारित किए जाते हैं।

असल में, इसका मतलब है कि आप वस्तु की एक प्रति की बजाय मूल वस्तु में सूचक की एक प्रति भेज रहे हैं।

यदि आप इसे समझने के लिए एक उदाहरण चाहते हैं, तो कृपया एक टिप्पणी छोड़ दें।

नहीं वास्तव में कोई नहीं।

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

जावा में संकेतक नहीं है क्योंकि इसकी आवश्यकता नहीं है। इस सवाल से आप किस प्रकार के उत्तर की उम्मीद कर रहे थे, यानी गहराई से आपको उम्मीद थी कि आप उन्हें कुछ के लिए इस्तेमाल कर सकते हैं या यह सिर्फ उत्सुकता है?

गॉडफ्रे नोलन द्वारा एंड्रॉइड द्वारा डिकपाईलिंग नाम की पुस्तक से

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

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

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

जैसा कि दूसरों ने कहा है, लघु उत्तर "नहीं" है

ज़रूर, आप जेएनआई कोड लिख सकते हैं जो जावा पॉइंटर्स के साथ खेलता है। आप जो पूरा करने की कोशिश कर रहे हैं उसके आधार पर, हो सकता है कि आपको कहीं मिले और शायद यह नहीं होगा

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

आप के रूप में अच्छी तरह से literals के लिए संकेत हो सकता है आपको उन्हें खुद को लागू करना होगा विशेषज्ञों के लिए यह बहुत बुनियादी है;) इंट / ऑब्जेक्ट / लाँग / बाइट और वॉयला की एक सरणी का उपयोग करें, आपके पास पॉइंटर्स को कार्यान्वित करने के लिए बुनियादी बातें हैं। अब किसी भी इंट वैल्यू उस सरणी int के लिए एक सूचक हो सकती है [] आप पॉइंटर को बढ़ा सकते हैं, आप पॉइंटर को घटा सकते हैं, आप पॉइंटर को गुणा कर सकते हैं। आप वास्तव में सूचक अंकगणित है! 1000 इंट एट्रिब्यूट क्लास को लागू करने का एकमात्र तरीका है और एक सामान्य तरीका है जो सभी विशेषताओं पर लागू होता है आप किसी ऐट के बजाय बाइट [] सरणी का भी उपयोग कर सकते हैं []

हालांकि मैं चाहता हूं कि जावा आपको संदर्भ के आधार पर वास्तविक मूल्यों को पारित करने देगा। लाइनों के साथ कुछ

//(* telling you it is a pointer) public void myMethod(int* intValue);

सभी जावा ऑब्जेक्ट्स पॉइंटर हैं क्योंकि एक वेरिएबल जो कि एड्रेस को रखता है, को पॉइंटर और ऑब्जेक्ट होल्ड एड्रेस कहते हैं। ऑब्जेक्ट पॉइंटर वैरिएबल है।