আমি জাভাতে পয়েন্টারগুলি কীভাবে ব্যবহার করতে পারি?


112

আমি জানি জাভাতে পয়েন্টার নেই, তবে আমি শুনেছি জাভা প্রোগ্রামগুলি পয়েন্টার দিয়ে তৈরি করা যেতে পারে এবং এটি জাভা বিশেষজ্ঞ যারা খুব কম লোকই করতে পারেন। এটা সত্যি?


1
যাইহোক সান এর বাস্তবায়নে।
মাইকেল মায়ার্স

1
আমি কি সেই পয়েন্টার ঠিকানাটি ব্যবহার করতে পারি

6
জাভা অবজেক্টের জন্য ডিফল্ট হ্যাশকোড এটির পয়েন্টার ঠিকানা নয়, হ্যাশকোডের জন্য চুক্তিটি সাবধানে পড়ুন এবং আপনি লক্ষ্য করবেন যে মেমরির দুটি স্বতন্ত্র বস্তুর একই হ্যাশকোড মান থাকতে পারে।
আমির আফগানি

3
64-বিট এবং 32-বিট জাভাতে, 32-বিট হ্যাশকোড ঠিকানা নয়। হ্যাশকোডগুলি অনন্য হওয়ার গ্যারান্টিযুক্ত নয়। কোনও বস্তুর অবস্থান মেমোরিতে স্থানান্তরিত হতে পারে কারণ এটি স্পেসগুলির মধ্যে স্থানান্তরিত হয় এবং মেমরিটি কমপ্যাক্ট হয়, হ্যাশকোড তবে পরিবর্তন হয় না।
পিটার লরে

2
আপনি জাভা রেফারেন্সের সাহায্যে সি ++ পয়েন্টারগুলি দিয়ে যা করতে পারেন তার 90%, আপনি বিরক্তিকর বস্তুর অভ্যন্তরে একটি রেফারেন্স প্যাকেজিং দ্বারা অর্জন করতে পারবেন বাকি 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আপনি নতুন কল করার সময় জাভা সিস্টেমটি একটি ব্যতিক্রম ( ) ছুঁড়ে দেবে এবং বরাদ্দকারী অনুরোধ করা ঘর বরাদ্দ করতে পারবেন না। এটি খুব বিরল এবং সাধারণত রান-আউট রিকার্সনের ফলাফল।

মনে রাখবেন, ভাষার দৃষ্টিকোণ থেকে, আবর্জনা সংগ্রহকারীকে অবজেক্টগুলি ত্যাগ করা মোটেই ত্রুটি নয়। এটি প্রোগ্রামারকে সচেতন হওয়া দরকার। একই পরিবর্তনশীল বিভিন্ন সময়ে বিভিন্ন অবজেক্টগুলিকে নির্দেশ করতে পারে এবং কোনও পয়েন্টার তাদের উল্লেখ না করে পুরানো মানগুলি পুনরুদ্ধার করা হবে। তবে যদি প্রোগ্রামটির যুক্তিটির জন্য অবজেক্টের কমপক্ষে একটি রেফারেন্স বজায় রাখা দরকার হয় তবে এটি একটি ত্রুটি ঘটবে।

বিজ্ঞপ্তি প্রায়শই নিম্নলিখিত ত্রুটি করে।

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

আপনি সম্ভবত যা বলতে চেয়েছিলেন তা হ'ল:

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

অনুপযুক্ত ingালাই:

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
উত্তম উত্তর, তবে আপনি একটি মূল পার্থক্য সমাধান করতে ব্যর্থ হয়েছেন: সি এর পয়েন্টার গাণিতিক রয়েছে has (ভাগ্যক্রমে) আপনি জাভাতে এটি করতে পারবেন না।
আর মার্টিনহো ফার্নান্দেস

10
আমি কোনও উত্তরই ভোট দিতে ঘৃণা করি না, বিশেষত একটি জনপ্রিয় যা জনপ্রিয়, তবে জাভার পয়েন্টার নেই এবং আপনি কেবল পয়েন্টারের মতো কোনও রেফারেন্স ব্যবহার করতে পারবেন না। এমন কিছু জিনিস রয়েছে যা আপনি কেবল আসল পয়েন্টার দিয়েই করতে পারেন - উদাহরণস্বরূপ, আপনি আপনার প্রক্রিয়া ডেটা স্পেসে কোনও বাইট পেতে বা সেট করতে পারেন। আপনি কেবল জাভাতে এটি করতে পারবেন না। এটি সত্যিই খারাপ যে এখানে এত লোকেরা বুঝতে পারে না যে পয়েন্টারটি আসলে কী তা বোঝে, ইমো, এবং এখন আমি আমার রেন্ট সাবান বক্সটি থেকে নামব এবং আশা করি আপনি আমার সামান্য উত্সাহের জন্য আমাকে ক্ষমা করবেন।
বিপদ

5
আমি মনে করি আপনি দুর্ভাগ্যবশত বলতে চাইছেন। আপনি কেন ভাবেন যে জাভা পয়েন্টার পাটিগণিত সমর্থন করে না?
ব্যবহারকারী 3462295

2
@ ব্যবহারকারী 3462295 কারণ লোকেরা মনে হয় সাধারণ জনগণের দ্বারা এটি ব্যবহার করা খুব কঠিন, এবং কেবল নিনজাস রচনা সংকলক বা ডিভাইস ড্রাইভারদের কোডিংয়ের মাধ্যমে বোঝা যায়।
আইকোডসোমটাইম

4
@ উত্তরের প্রথম সারির রেখাটি "জাভাতে থাকা সমস্ত বস্তুগুলি রেফারেন্স এবং আপনি সেগুলি পয়েন্টারের মতো ব্যবহার করতে পারেন।" এটি সর্বোত্তম উত্তর যা সরবরাহ করা যেতে পারে। যদি কেবল উত্তরটি ছিল "না, জাভাটির কোনও পয়েন্টার নেই।" উত্তরটি হতভাগ্য হত। এই উত্তরের পরিবর্তে আপনি পরিবর্তে কী করতে পারেন তা জানায়।
csga5000

46

জাভা পয়েন্টার আছে। যে কোনও সময় আপনি জাভাতে কোনও বস্তু তৈরি করার সময় আপনি আসলে বস্তুটির জন্য একটি পয়েন্টার তৈরি করছেন; এই পয়েন্টারটি তখন অন্য কোনও অবজেক্টে বা সেট করা যেতে পারে nullএবং মূল অবজেক্টটি এখনও বিদ্যমান থাকবে (আবর্জনা সংগ্রহের মুলতুবি)।

জাভাতে আপনি যা করতে পারবেন না তা হ'ল পয়েন্টার গাণিতিক। আপনি একটি নির্দিষ্ট মেমরি ঠিকানা বা একটি পয়েন্টার বৃদ্ধি করতে পারেন।

আপনি যদি সত্যিই নিম্ন-স্তর পেতে চান তবে এটি করার একমাত্র উপায় জাভা নেটিভ ইন্টারফেসের সাথে ; এবং তারপরেও নিম্ন-স্তরের অংশটি সি বা সি ++ এ করতে হবে।


9
জাভাতে কেবল পয়েন্টার, সরল এবং সরল থাকে না এবং আমার জীবনের জন্য আমি বুঝতে পারি না কেন এত উত্তর এখানে ভুল তথ্য বলে। এটি স্ট্যাক ওভারফ্লো লোকেরা! কম্পিউটার বিজ্ঞানের একটি পয়েন্টারের সংজ্ঞাটি হ'ল (আপনি এটির জন্য গুগল করতে পারেন): "কম্পিউটার বিজ্ঞানে একটি পয়েন্টার হল একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ অবজেক্ট, যার মান কম্পিউটার মেমোরিতে অন্য কোথাও সঞ্চিত অন্য মানকে (বা" পয়েন্ট ") বোঝায় refers এটির ঠিকানা " জাভাতে একটি রেফারেন্স কোনও পয়েন্টার নয়। জাভা আবর্জনা সংগ্রহ চালানো প্রয়োজন এবং যদি আপনার একটি সত্য পয়েন্টার থাকে তবে এটি ভুল হবে!
বিপদ

3
@ ড্যাঞ্জার একটি পয়েন্টার হ'ল মেমরি ঠিকানা সম্বলিত ডেটার টুকরো। জাভা দুটি জিনিস, যা মানুষ ভুলে যায়। এটি একটি ভাষা এবং একটি প্ল্যাটফর্ম। যেহেতু কেউ এটি না বলবে না। নেট একটি ভাষা, আমাদের মনে রাখতে হবে যে 'জাভা পয়েন্টার নেই' বলা বিভ্রান্তিকর হতে পারে কারণ প্ল্যাটফর্মটির অবশ্যই পয়েন্টার রয়েছে এবং এটি ব্যবহার করে। এই পয়েন্টারগুলি জাভা ভাষার মাধ্যমে প্রোগ্রামারটিতে অ্যাক্সেসযোগ্য নয়, তবে রানটাইমে এগুলি বিদ্যমান। রানটাইমে প্রকৃত পয়েন্টারের শীর্ষে ভাষার উল্লেখগুলি বিদ্যমান।
কিংফ্রিটো_5005

@ কিংফ্রিটো_5005 মনে হবে আপনি আমার সাথে একমত হচ্ছেন। আমি বিশ্বাস করি আপনি বলেছিলেন যে "ওই পয়েন্টারগুলি জাভা ভাষার মাধ্যমে প্রোগ্রামারটিতে অ্যাক্সেসযোগ্য নয়" যা আমার বক্তব্যের সাথে সামঞ্জস্যপূর্ণ যে "জাভার পয়েন্টার নেই" " উল্লেখগুলি পয়েন্টার থেকে শব্দার্থগতভাবে উল্লেখযোগ্যভাবে পৃথক।
বিপদ

1
@ ড্যাঞ্জার এটি সত্য, তবে আমি এই ক্ষেত্রে প্ল্যাটফর্ম এবং ভাষার মধ্যে পার্থক্য করা গুরুত্বপূর্ণ বলে মনে করি কারণ আমি জানি যে আমি যখন প্রথম আপনার মত বিবৃতি শুরু করতাম তখন আমাকে বিভ্রান্ত করে দিত।
কিংফ্রিটো_5005

1
হ্যাঁ, জাভা অবশ্যই ভেরিয়েবল পিছনে পয়েন্টার আছে। এটি কেবলমাত্র বিকাশকারীদের তাদের মোকাবেলা করতে হবে না কারণ জাভা এই পর্দার পিছনে যাদু করছে doing এর অর্থ বিকাশকারীদের কোনও নির্দিষ্ট মেমোরি অ্যাড্রেসে সরাসরি কোনও ভেরিয়েবল নির্দেশ করার অনুমতি দেওয়া হয় না এবং ডেটা অফসেট এবং স্টাফের সাথে ডিল করতে হয়। এটি জাভাটিকে একটি পরিষ্কার স্মৃতি আবর্জনা সংগ্রহ রাখতে দেয়, তবে যেহেতু প্রতিটি পরিবর্তনশীল একটি পয়েন্টার আবশ্যক, তাই সেই সমস্ত স্বয়ংক্রিয় উত্পন্ন পয়েন্টার অ্যাড্রেসগুলি পেতে কিছু অতিরিক্ত স্মৃতিও লাগে, যা আরও নিম্ন স্তরের ভাষায় এড়ানো যেতে পারে।
ভলাস্টার

38

জাভাতে কোনও পয়েন্টার ডেটা টাইপ না থাকায় জাভাতে পয়েন্টার ব্যবহার করা অসম্ভব। এমনকি কয়েকজন বিশেষজ্ঞ জাভাতে পয়েন্টার ব্যবহার করতে পারবেন না।

শেষ পয়েন্টটিও দেখুন: জাভা ভাষা পরিবেশ


3
এখানে কয়েকটি সঠিক উত্তরগুলির মধ্যে একটির পক্ষে খুব কমই সফলতা রয়েছে?
বিপদ

নোট করুন যে সেখানে 'পয়েন্টার' অবজেক্ট রয়েছে যা পয়েন্টার লাইক আচরণের অনুকরণ করে। অনেকগুলি উদ্দেশ্যে এটি একইভাবে ব্যবহার করা যেতে পারে, মেমরি স্তরকে সম্বোধন সহ্য না করা। প্রশ্নের প্রকৃতি দেওয়াতে আমি এটিকে বিজোড় বোধ করি যে এটি অন্য কেউ উল্লেখ করেনি।
কিংফ্রিটো_5005

এটি শীর্ষে উত্তর হওয়া উচিত। কারণ নবীনদের জন্য যে "পর্দার পিছনে জাভা পয়েন্টার রয়েছে" খুব বিভ্রান্তিকর অবস্থার দিকে নিয়ে যেতে পারে। এমনকি যখন জাভা প্রাথমিক স্তরে শেখানো হয় তখনও শেখানো হয় যে পয়েন্টারগুলি নিরাপদ নয় তাই সেগুলি জাভাতে ব্যবহৃত হয় না। একজন প্রোগ্রামারকে সে / সে কী দেখতে এবং কাজ করতে পারে তা জানাতে হবে। রেফারেন্স এবং পয়েন্টারগুলি আসলে খুব আলাদা।
নীরজ যাদব

নিশ্চিত নয় যে আমি লিঙ্কটিতে "2.2.3 কোনও এনামস" বিষয়টির সাথে সম্পূর্ণরূপে একমত। ডেটা পুরানো হতে পারে তবে জাভা এনামগুলিকে সমর্থন করে
সোমটাউনজেক

1
@ সোমটাউনজেক ডকুমেন্টটি লিঙ্ক করেছেন এটি ১৯৯ paper সালের একটি সাদা কাগজ যা জাভাটির প্রথম সংস্করণ বর্ণনা করে। এনামগুলি জাভা সংস্করণ 1.5 (2004) এ চালু করা হয়েছে
ফোর্টেগা

11

জাভাতে পয়েন্টার রয়েছে, তবে আপনি সেগুলি যেভাবে সি ++ বা সি তে পারেন তা ব্যবহার করতে পারবেন না যখন আপনি কোনও বস্তু পাস করেন, আপনি সেই অবজেক্টে একটি পয়েন্টারটি অতিক্রম করছেন, তবে সি ++ এর মতো একই অর্থে নয়। এই অবজেক্টটি ডিফারেন্স করা যায় না। যদি আপনি এর নেটিভ অ্যাক্সেসরগুলি ব্যবহার করে এর মানগুলি সেট করেন তবে এটি পরিবর্তন হবে কারণ জাভা পয়েন্টারের মাধ্যমে তার মেমরির অবস্থানটি জানে। তবে পয়েন্টারটি অপরিবর্তনীয়। যখন আপনি পয়েন্টারটিকে কোনও নতুন স্থানে সেট করার চেষ্টা করছেন, আপনি পরিবর্তে অন্য একটি স্থানীয় নামের সাথে একই নামের সাথে শেষ করুন। আসল অবজেক্টটি অপরিবর্তিত। পার্থক্যটি প্রদর্শনের জন্য এখানে একটি সংক্ষিপ্ত প্রোগ্রাম দেওয়া হল।

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

জাভাতে সি-এর মতো পয়েন্টার নেই, তবে এটি আপনাকে গাদাতে নতুন অবজেক্ট তৈরি করতে দেয় যা ভেরিয়েবলগুলি দ্বারা "রেফারেন্স করা" হয়। পয়েন্টারের অভাব হ'ল জাভা প্রোগ্রামগুলিকে অবৈধভাবে মেমরির অবস্থানগুলি উল্লেখ করা থেকে বিরত করা এবং জাভা ভার্চুয়াল মেশিন দ্বারা আবর্জনা সংগ্রহের ব্যবস্থা স্বয়ংক্রিয়ভাবে চালিত করা সক্ষম করে।


7

আপনি অনিরাপদ বর্গ ব্যবহার করে ঠিকানা এবং পয়েন্টার ব্যবহার করতে পারেন। তবে নামটি যেমন বোঝায়, এই পদ্ধতিগুলি আনসাফ এবং সাধারণত একটি খারাপ ধারণা। ভুল ব্যবহারের ফলে আপনার জেভিএম এলোমেলোভাবে মারা যায় (আসলে একই সমস্যা সি / সি ++ তে ভুল পয়েন্টার ব্যবহার করা)

আপনি পয়েন্টারগুলিতে অভ্যস্ত হয়ে থাকতে পারেন এবং আপনার তাদের প্রয়োজন মনে করে (কারণ আপনি কীভাবে অন্য কোনও কোড কোড করবেন তা জানেন না) তবে আপনি দেখতে পাবেন যে আপনি এটি করেন নি এবং আপনি এটির জন্য আরও ভাল থাকবেন।


8
পয়েন্টারগুলি অত্যন্ত শক্তিশালী এবং দরকারী। অনেকগুলি ক্ষেত্রে রয়েছে যেখানে পয়েন্টার (জাভা) না থাকা কোডকে অনেক কম দক্ষ করে তোলে। পয়েন্টার ব্যবহারে লোকেরা স্তন্যপান করে কেবল তাই এর অর্থ এই নয় যে ভাষাগুলি সেগুলি বাদ দেয়। আমার কাছে রাইফেল রাখা উচিত নয় কারণ অন্যরা (সেনাবাহিনীর মতো) লোককে হত্যা করার জন্য সেগুলি ব্যবহার করে?
ইথান রিসর

1
ভাষাটি যেমন জাভাতে করতে পারেন তেমন কোনও দরকারী বা শক্তিশালী নেই। অন্য সমস্ত কিছুর জন্য অনিরাপদ শ্রেণি রয়েছে যা আমি খুব কমই ব্যবহার করা দরকার বলে মনে করি।
পিটার লরে

2
আমি গত 40 বছরে যে কোডটি লিখেছি তার বেশিরভাগটি জাভাতে কখনও প্রয়োগ করা যেতে পারে নি, কারণ জাভাতে মূল, নিম্ন স্তরের সক্ষমতা নেই।
বিপদ

1
@ ডেঞ্জার এজন্য যে বিপুল সংখ্যক গ্রন্থাগারগুলি অনিরাপদ ব্যবহার করে এবং এটি অপসারণের ধারণাটি জাভা in-তে এতো বিতর্ক সৃষ্টি করেছে, পরিকল্পনাটি প্রতিস্থাপনের পরিকল্পনা করা হচ্ছে, তবে তারা এখনও প্রস্তুত নয়।
পিটার লরি

3

প্রযুক্তিগতভাবে, সমস্ত জাভা অবজেক্ট পয়েন্টার। সমস্ত আদিম ধরণের মান যদিও। এই পয়েন্টারগুলির ম্যানুয়াল নিয়ন্ত্রণ নেওয়ার কোনও উপায় নেই। জাভা কেবল অভ্যন্তরীণভাবে পাস-বাই-রেফারেন্স ব্যবহার করে।


1
এমনকি জেএনআইয়ের মাধ্যমেও নয়? এখানে জাভা জ্ঞানের কথা বলার দরকার নেই, তবে আমি ভেবেছিলাম আপনি শুনেছেন আপনি কিছু নিম্ন স্তরের বিট-গ্রাবিং করতে পারেন।
ডেভিড সেলার

যতদূর আমার জাভা অভিজ্ঞতা 4 বছরের অভিজ্ঞতা এবং উত্তর খুঁজছেন নিজেই না বলে, জাভা পয়েন্টার বাহ্যিকভাবে অ্যাক্সেসযোগ্য নয়।
Poindexter

প্রতিক্রিয়া জন্য ধন্যবাদ। আমি জিজ্ঞাসা করেছি কারণ, আমার প্রভাষক বলেছিলেন যে গবেষণার স্তরে যেখানে জাভা হ্যান্ডহেল্ড ডিভাইসগুলিতে ব্যবহৃত হত, তারা পয়েন্টার ব্যবহার করে ... তাই কেন আমি জিজ্ঞাসা করেছি

@ অজ্ঞাত (গুগল) যদি গবেষণা পর্যায়ে থাকে তবে যা করা হচ্ছে তার উপর নির্ভর করে এটি হতে পারে যে তাদের এ জাতীয় কার্যকারিতা দরকার ছিল, তাই তারা সাধারণ প্রতিমাগুলিকে লঙ্ঘন করেছে এবং যেভাবেই হোক এগুলি বাস্তবায়ন করেছে। আপনি যদি নিজের মতো করে সাধারণ জাভা বৈশিষ্ট্যের সুপারসেট (বা সাবসেট, বা মিশ্রণ) নিতে চান তবে আপনি নিজের জেভিএম বাস্তবায়ন করতে পারেন, তবে এই জাতীয় কোড অন্য জাভা প্ল্যাটফর্মগুলিতে চলতে পারে না।
সান জ্যাকিন্তো

@ সান: উত্তরের জন্য ধন্যবাদ। বিটিডাব্লু আমি ভোট দিতে পারি না .. যেভাবে আমার 15 খ্যাতি দরকার

2

আসলেই না, না।

জাভা পয়েন্টার নেই। আপনি যদি সত্যিই চেয়েছিলেন আপনি প্রতিবিম্বের মতো কিছু তৈরি করে এগুলি অনুকরণ করার চেষ্টা করতে পারেন তবে এতে কোনও উপকারিতা ছাড়াই পয়েন্টারগুলির জটিলতা রয়েছে ।

জাভা পয়েন্টার নেই কারণ এটি তাদের প্রয়োজন হয় না। আপনি এই প্রশ্নটি থেকে কী ধরণের উত্তরের জন্য প্রত্যাশা করছেন, অর্থাত্ গভীরভাবে আপনি কী আশা করেছিলেন যে আপনি সেগুলি কোনও কিছুর জন্য ব্যবহার করতে পারবেন বা এটি কেবল কৌতূহল?


আমি এটি জানতে আগ্রহী। উত্তরের জন্য ধন্যবাদ

জাভা পয়েন্টার প্রয়োজন, এবং সে কারণেই জাভা জেএনআই যুক্ত করেছে - "পয়েন্টার-জাতীয়" বা নিম্ন স্তরের ফাংশনগুলির অভাব ঘটাতে আপনি কেবল জাভাতে করতে পারবেন না, আপনি যে কোডই লেখেন না কেন।
বিপদ

2

জাভাতে সমস্ত বস্তু আদিমগুলি বাদে রেফারেন্স কপির মাধ্যমে ফাংশনে প্রেরণ করা হয়।

বাস্তবে, এর অর্থ হ'ল আপনি পয়েন্টারের একটি অনুলিপি মূল বস্তুটিতে পাঠিয়ে দিচ্ছেন না বরং বস্তুর নিজেই অনুলিপি করছেন।

আপনি যদি এটি বুঝতে কোনও উদাহরণ চান তবে দয়া করে একটি মন্তব্য দিন।


এটি সাধারণ ভুল। আপনি swapজাভাতে কোনও ফাংশন লিখতে পারবেন না যা দুটি অবজেক্টকে বদল করবে।
মাইকেল সাং

2

জাভা রেফারেন্সের ধরণগুলি সি পয়েন্টারগুলির সমান নয় কারণ জাভাতে আপনার কোনও পয়েন্টারের কাছে পয়েন্টার থাকতে পারে না।


1

অন্যরা যেমন বলেছে, সংক্ষিপ্ত উত্তরটি "না"।

অবশ্যই, আপনি জেএনআই কোড লিখতে পারেন যা জাভা পয়েন্টারগুলির সাথে খেলে। আপনি কী অর্জন করতে চাইছেন তার উপর নির্ভর করে, সম্ভবত এটি আপনাকে কোথাও পেয়েছে এবং সম্ভবত তা করবে না।

আপনি সর্বদা বিন্যাস তৈরি করে অ্যারে তৈরি করে এবং সূচীর সাথে অ্যারেতে কাজ করতে পারেন। আবার আপনি কী অর্জন করতে চাইছেন তার উপর নির্ভর করে এটি কার্যকর হতে পারে বা নাও পারে।


1

গডফ্রে নোলানের ডেকম্পিলিং অ্যান্ড্রয়েড নামের বইটি থেকে

সুরক্ষা নির্দেশ করে যে জাভাতে পয়েন্টার ব্যবহার করা হয় না তাই হ্যাকাররা কোনও অ্যাপ্লিকেশন এবং অপারেটিং সিস্টেমের বাইরে বেরিয়ে আসতে পারে না। কোন পয়েন্টার মানে না যে অন্য কিছু ---- এই ক্ষেত্রে, জেভিএম ---- বরাদ্দকরণ এবং মেমরি মুক্ত করার যত্ন নিতে হবে। মেমরি ফাঁসও অতীতের জিনিস হয়ে উঠতে হবে, বা তত্ত্বটি যায়। সি এবং সি ++ তে লিখিত কিছু অ্যাপ্লিকেশনগুলি চালনার মতো মেমরি ফাঁস করার জন্য কুখ্যাত হয় কারণ প্রোগ্রামাররা উপযুক্ত সময়ে অযাচিত স্মৃতি মুক্ত করার দিকে মনোযোগ দেয় না ---- এটি নয় যে এটি পড়ার কেউ এই ধরনের পাপের জন্য দোষী হবে। ময়লা সমস্যা ডিবাগ করতে কম সময় ব্যয় করে প্রোগ্রামারদের আরও মজাদার সংগ্রহ করা উচিত G


0

আপনার আক্ষরিক জন্য পয়েন্টার থাকতে পারে। এগুলি আপনাকে নিজেই প্রয়োগ করতে হবে। এটি বিশেষজ্ঞদের জন্য বেশ বেসিক;)। পয়েন্টার বাস্তবায়নের জন্য আপনার কাছে বেস / অবজেক্ট / লং / বাইট এবং ভয়েলা এর অ্যারে ব্যবহার করুন। এখন যে কোনও ইনট মানটি সেই অ্যারে ইন্ট [] এর পয়েন্টার হতে পারে। আপনি পয়েন্টারটি বৃদ্ধি করতে পারবেন, আপনি পয়েন্টারটি হ্রাস করতে পারবেন, আপনি পয়েন্টারকে গুণ করতে পারবেন। আপনার কাছে পয়েন্টার গাণিতিক আছে! 1000 ইনট্রিবিউট ক্লাস প্রয়োগ করা এবং একটি জেনেরিক পদ্ধতি রয়েছে যা সমস্ত বৈশিষ্ট্যের ক্ষেত্রে প্রযোজ্য। আপনি কোনও ইনট এর পরিবর্তে বাইট [] অ্যারেও ব্যবহার করতে পারেন []

তবে আমি চাই জাভা আপনাকে রেফারেন্স দ্বারা আক্ষরিক মানগুলি পাস করতে দেয়। লাইন বরাবর কিছু

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


-1

সমস্ত জাভা অবজেক্ট পয়েন্টার কারণ একটি ভেরিয়েবল যা ঠিকানা রাখে তাকে পয়েন্টার এবং অবজেক্ট হোল্ড অ্যাড্রেস বলে। সুতরাং অবজেক্ট পয়েন্টার ভেরিয়েবল।


1
না, জাভা অবজেক্টস পয়েন্টার নয়। তারা উল্লেখগুলির সমতুল্য, যার ক্ষমতা এবং শব্দার্থবিজ্ঞানের একটি আলাদা সেট রয়েছে।
বিপদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.