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


112

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


1
वैसे भी सूर्य के कार्यान्वयन में।
माइकल मायर्स

1
क्या मैं उस सूचक पते का उपयोग कर सकता हूँ

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

3
64-बिट और 32-बिट जावा में, 32-बिट हैशकोड पता नहीं है। हैशकोड अद्वितीय होने की गारंटी नहीं है। किसी ऑब्जेक्ट का स्थान मेमोरी में स्थानांतरित किया जा सकता है क्योंकि यह रिक्त स्थान के बीच स्थानांतरित हो गया है और मेमोरी को कॉम्पैक्ट किया गया है, हालांकि हैशकोड नहीं बदलता है।
पीटर लॉरी

2
90% आप C ++ पॉइंटर्स के साथ क्या कर सकते हैं जो आप जावा रिफरेन्स के साथ कर सकते हैं, शेष 10% आप एन्टरॉइंट ऑब्जेक्ट के अंदर एक रेफ़रेंसिंग द्वारा प्राप्त कर सकते हैं (ऐसा नहीं है कि मैंने कभी ऐसा करने के लिए इसे पाया है)
रिचर्ड टरले

जवाबों:


243

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

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

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

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
    }
} 

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


16
अच्छा उत्तर, लेकिन आप एक महत्वपूर्ण अंतर को संबोधित करने में विफल रहे: सी में सूचक अंकगणित हैं। (सौभाग्य से) आप जावा में ऐसा नहीं कर सकते।
आर। मार्टिनो फर्नांडिस

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

5
मुझे लगता है कि आप दुर्भाग्य से मतलब है। आप क्यों सोचेंगे कि यह अच्छा है कि जावा सूचक अंकगणित का समर्थन नहीं करता है?
user3462295

2
@ user3462295 क्योंकि लोगों को लगता है कि सामान्य आबादी द्वारा इस्तेमाल किया जाना बहुत मुश्किल है, और इसे केवल निनजा लेखन कंपाइलर या डिवाइस ड्राइवर को कोड करके समझा जा सकता है।
iDodeSometime

4
@ डेंजर उत्तर की पहली पंक्ति "जावा में सभी ऑब्जेक्ट संदर्भ हैं और आप उन्हें पॉइंटर्स की तरह उपयोग कर सकते हैं।" यह सबसे अच्छा जवाब है जो प्रदान किया जा सकता है। यदि एकमात्र उत्तर था "नहीं, जावा में कोई संकेत नहीं है।" वह उत्तर अदम्य रहा होगा। इसके बजाय यह उत्तर बताता है कि आप इसके बजाय क्या कर सकते हैं।
csga5000

46

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

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

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


9
जावा में बस पॉइंटर्स, प्लेन और सिंपल नहीं होते हैं, और मैं अपने जीवन के लिए नहीं समझ सकता कि यहाँ इतने सारे उत्तर गलत जानकारी क्यों देते हैं। यह StackOverlfow लोग हैं! कंप्यूटर विज्ञान में एक पॉइंटर की परिभाषा है (आप इसके लिए Google कर सकते हैं): "कंप्यूटर विज्ञान में, एक पॉइंटर एक प्रोग्रामिंग भाषा ऑब्जेक्ट है, जिसका मान संदर्भित है (या" को इंगित करता है) एक और मान का उपयोग करके कंप्यूटर मेमोरी में कहीं और संग्रहीत किया जाता है। इसका पता। " जावा में एक संदर्भ एक सूचक नहीं है। जावा को कचरा संग्रह चलाने की आवश्यकता है और यदि आपके पास असली सूचक है तो यह गलत होगा!
डेंजर

3
@ डेंजर एक पॉइंटर एक मेमोरी एड्रेस वाला डेटा का एक टुकड़ा है। जावा दो चीजें हैं, जिन्हें लोग भूल जाते हैं। यह एक भाषा और एक मंच है। बहुत से लोग यह नहीं कहेंगे कि .NET एक भाषा है, हमें यह याद रखना चाहिए कि 'Java में पॉइंटर्स नहीं हैं' यह कहना भ्रामक हो सकता है क्योंकि प्लेटफ़ॉर्म निश्चित रूप से है और पॉइंटर्स का उपयोग करता है। वे संकेत जावा भाषा के माध्यम से प्रोग्रामर के लिए सुलभ नहीं हैं, लेकिन वे रनटाइम में मौजूद हैं। भाषा में संदर्भ रनटाइम में वास्तविक संकेत के शीर्ष पर मौजूद हैं।
Kingfrito_5005

@ kingfrito_5005 ऐसा लगेगा कि आप मुझसे सहमत हैं। मेरा मानना ​​है कि आपने "जावा भाषा के माध्यम से प्रोग्रामर तक पहुंच नहीं पाया है" जो मेरे कथन के अनुरूप है कि "जावा में पॉइंटर्स नहीं हैं"। संदर्भ शब्दार्थ से काफी भिन्न होते हैं।
डेंजर

1
@ डेंजर यह सच है, लेकिन मुझे लगता है कि इन मामलों में प्लेटफ़ॉर्म और भाषा के बीच अंतर करना महत्वपूर्ण है क्योंकि मुझे पता है कि जब मैं पहली बार एक बयान शुरू कर रहा था, तो आपकी तरह ने मुझे भ्रमित किया होगा।
Kingfrito_5005

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

38

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

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


3
यहाँ कुछ सही उत्तरों में से एक का शायद ही कोई उत्थान हो?
डेंजर

ध्यान दें कि वहाँ मौजूद 'पॉइंटर' ऑब्जेक्ट्स हैं जो पॉइंटर समान व्यवहार का अनुकरण करते हैं। कई उद्देश्यों के लिए इसे उसी तरह से इस्तेमाल किया जा सकता है, स्मृति स्तर को संबोधित करते हुए। प्रश्न की प्रकृति को देखते हुए मुझे यह अजीब लगता है कि किसी और ने इसका उल्लेख नहीं किया है।
Kingfrito_5005

यह शीर्ष पर उत्तर होना चाहिए। क्योंकि शुरुआती लोगों के लिए यह बताना कि "पर्दे के पीछे जावा में संकेत हैं" बहुत भ्रामक स्थिति पैदा कर सकता है। यहां तक ​​कि जब जावा को शुरुआती स्तर पर पढ़ाया जाता है, तो यह सिखाया जाता है कि संकेत सुरक्षित नहीं हैं, इसलिए उन्हें जावा में उपयोग नहीं किया जाता है। एक प्रोग्रामर को यह बताया जाना चाहिए कि वह क्या काम कर सकता है। संदर्भ और संकेत वास्तव में बहुत अलग हैं।
नीरज यादव

सुनिश्चित नहीं है कि मैं लिंक में "2.2.3 नो एनम" विषय से पूरी तरह सहमत हूं। डेटा पुराना हो सकता है, लेकिन जावा एनम का समर्थन करता है
23

1
@Sometowngeek से जुड़ा दस्तावेज़ 1996 का एक श्वेत पत्र है जिसमें जावा के पहले संस्करण का वर्णन किया गया है।
एनम

11

जावा में पॉइंटर्स हैं, लेकिन आप उन्हें उस तरह से जोड़ नहीं सकते हैं जो आप C ++ या C. में कर सकते हैं। जब आप कोई ऑब्जेक्ट पास करते हैं, तो आप उस ऑब्जेक्ट के लिए एक पॉइंटर पास कर रहे हैं, लेकिन C ++ की तरह ही नहीं। उस वस्तु को निष्क्रिय नहीं किया जा सकता है। यदि आप इसके मूल एक्सेसर्स का उपयोग करके इसके मान सेट करते हैं, तो यह बदल जाएगा क्योंकि जावा पॉइंटर के माध्यम से अपनी मेमोरी लोकेशन जानता है। लेकिन सूचक अपरिवर्तनीय है। जब आप पॉइंटर को एक नए स्थान पर सेट करने का प्रयास करते हैं, तो आप दूसरे के समान नाम के साथ एक नए स्थानीय ऑब्जेक्ट के साथ समाप्त होते हैं। मूल वस्तु अपरिवर्तित है। यहाँ अंतर प्रदर्शित करने के लिए एक संक्षिप्त कार्यक्रम है।

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 पर चलाया जा सकता है।


10

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


7

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

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


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

1
भाषा के रूप में आप जावा में बहुत उपयोगी या शक्तिशाली नहीं है। बाकी सब चीजों के लिए असुरक्षित वर्ग है जो मुझे लगता है कि मुझे बहुत कम उपयोग करने की आवश्यकता है।
पीटर लॉरी

2
पिछले 40 वर्षों में मैंने जो कोड लिखे हैं उनमें से अधिकांश जावा में कभी लागू नहीं हो सकते थे, क्योंकि जावा में कोर, निम्न स्तर की क्षमताओं का अभाव है।
डेंजर

1
@ डेंजर जिसके कारण बड़ी संख्या में पुस्तकालय असुरक्षित का उपयोग करते हैं और इसे हटाने के विचार ने जावा 9 में इतनी बहस छेड़ दी है। योजना प्रतिस्थापन प्रदान करने के लिए है, लेकिन वे अभी तक तैयार नहीं हैं।
पीटर लॉरी

3

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


1
जेएनआई के माध्यम से भी नहीं? यहाँ बोलने के लिए कोई जावा ज्ञान नहीं है, लेकिन मैंने सोचा कि मैंने सुना है कि आप इस तरह से कुछ निम्न स्तर के बिट-ग्रबिंग कर सकते हैं।
डेविड सेलर

जहाँ तक मेरे ~ 4 साल के जावा अनुभव और खुद के जवाब की तलाश में है, नहीं, जावा पॉइंटर्स बाहरी रूप से सुलभ नहीं हैं।
Poindexter

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

@unknown (google) यदि यह अनुसंधान के स्तर पर है, तो जो किया जा रहा है, उसके आधार पर, यह हो सकता है कि उन्हें ऐसी कार्यक्षमता की आवश्यकता थी, इसलिए उन्होंने सामान्य मुहावरों का उल्लंघन किया और उन्हें वैसे भी लागू किया। आप अपने स्वयं के JVM को लागू कर सकते हैं यदि आप सामान्य जावा सुविधाओं के सुपरसेट (या सबसेट, या मिश्रण) की इच्छा रखते हैं, लेकिन ऐसा कोड अन्य जावा प्लेटफार्मों पर नहीं चल सकता है।
सैन जैसिंटो

@san: उत्तर के लिए धन्यवाद। BTW मैं मतदान नहीं कर सकता..इसलिए मुझे 15 प्रतिष्ठा की आवश्यकता है

2

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

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

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


मुझे यह जानने की उत्सुकता है। जवाब के लिए धन्यवाद

जावा को पॉइंटर्स की आवश्यकता होती है, और यही कारण है कि जावा ने जेएनआई को जोड़ा - "पॉइंटर-जैसे" या निचले स्तर के कार्यों की कमी के बारे में जानने के लिए आप बस जावा में नहीं कर सकते, चाहे आप कोई भी कोड लिखें।
डेंजर

2

जावा में सभी वस्तुओं को प्राइमरी को छोड़कर संदर्भ प्रतिलिपि द्वारा कार्यों के लिए पारित किया जाता है।

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

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


यह सादा गलत है। आप swapजावा में एक फ़ंक्शन नहीं लिख सकते हैं जो दो वस्तुओं को स्वैप करेगा।
माइकल Tsang

2

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


1

जैसा कि दूसरों ने कहा है, संक्षिप्त उत्तर "नहीं" है।

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

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


1

गॉडफ्रे नोलन द्वारा Decompiling Android नाम की पुस्तक से

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


0

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

हालाँकि, मैं चाहता हूँ कि जावा आपको संदर्भ द्वारा शाब्दिक मान दे। रेखाओं के साथ कुछ

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


-1

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


1
नहीं, जावा ऑब्जेक्ट्स पॉइंटर्स नहीं हैं। वे संदर्भों के समतुल्य हैं, जिनमें क्षमताओं और शब्दार्थ का एक अलग समूह है।
डेंजर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.