আমি জানি জাভাতে পয়েন্টার নেই, তবে আমি শুনেছি জাভা প্রোগ্রামগুলি পয়েন্টার দিয়ে তৈরি করা যেতে পারে এবং এটি জাভা বিশেষজ্ঞ যারা খুব কম লোকই করতে পারেন। এটা সত্যি?
আমি জানি জাভাতে পয়েন্টার নেই, তবে আমি শুনেছি জাভা প্রোগ্রামগুলি পয়েন্টার দিয়ে তৈরি করা যেতে পারে এবং এটি জাভা বিশেষজ্ঞ যারা খুব কম লোকই করতে পারেন। এটা সত্যি?
উত্তর:
জাভাতে সমস্ত বস্তুগুলি রেফারেন্স এবং আপনি পয়েন্টারের মতো এগুলি ব্যবহার করতে পারেন।
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
}
}
আপডেট: মন্তব্যগুলিতে পরামর্শ অনুসারে একটি অবশ্যই খেয়াল করবে যে সি এর পয়েন্টার গাণিতিক রয়েছে। তবে জাভাতে আমাদের তা নেই।
জাভা পয়েন্টার আছে। যে কোনও সময় আপনি জাভাতে কোনও বস্তু তৈরি করার সময় আপনি আসলে বস্তুটির জন্য একটি পয়েন্টার তৈরি করছেন; এই পয়েন্টারটি তখন অন্য কোনও অবজেক্টে বা সেট করা যেতে পারে null
এবং মূল অবজেক্টটি এখনও বিদ্যমান থাকবে (আবর্জনা সংগ্রহের মুলতুবি)।
জাভাতে আপনি যা করতে পারবেন না তা হ'ল পয়েন্টার গাণিতিক। আপনি একটি নির্দিষ্ট মেমরি ঠিকানা বা একটি পয়েন্টার বৃদ্ধি করতে পারেন।
আপনি যদি সত্যিই নিম্ন-স্তর পেতে চান তবে এটি করার একমাত্র উপায় জাভা নেটিভ ইন্টারফেসের সাথে ; এবং তারপরেও নিম্ন-স্তরের অংশটি সি বা সি ++ এ করতে হবে।
জাভাতে কোনও পয়েন্টার ডেটা টাইপ না থাকায় জাভাতে পয়েন্টার ব্যবহার করা অসম্ভব। এমনকি কয়েকজন বিশেষজ্ঞ জাভাতে পয়েন্টার ব্যবহার করতে পারবেন না।
শেষ পয়েন্টটিও দেখুন: জাভা ভাষা পরিবেশ
জাভাতে পয়েন্টার রয়েছে, তবে আপনি সেগুলি যেভাবে সি ++ বা সি তে পারেন তা ব্যবহার করতে পারবেন না যখন আপনি কোনও বস্তু পাস করেন, আপনি সেই অবজেক্টে একটি পয়েন্টারটি অতিক্রম করছেন, তবে সি ++ এর মতো একই অর্থে নয়। এই অবজেক্টটি ডিফারেন্স করা যায় না। যদি আপনি এর নেটিভ অ্যাক্সেসরগুলি ব্যবহার করে এর মানগুলি সেট করেন তবে এটি পরিবর্তন হবে কারণ জাভা পয়েন্টারের মাধ্যমে তার মেমরির অবস্থানটি জানে। তবে পয়েন্টারটি অপরিবর্তনীয়। যখন আপনি পয়েন্টারটিকে কোনও নতুন স্থানে সেট করার চেষ্টা করছেন, আপনি পরিবর্তে অন্য একটি স্থানীয় নামের সাথে একই নামের সাথে শেষ করুন। আসল অবজেক্টটি অপরিবর্তিত। পার্থক্যটি প্রদর্শনের জন্য এখানে একটি সংক্ষিপ্ত প্রোগ্রাম দেওয়া হল।
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 এ চালানো যেতে পারে।
জাভাতে সি-এর মতো পয়েন্টার নেই, তবে এটি আপনাকে গাদাতে নতুন অবজেক্ট তৈরি করতে দেয় যা ভেরিয়েবলগুলি দ্বারা "রেফারেন্স করা" হয়। পয়েন্টারের অভাব হ'ল জাভা প্রোগ্রামগুলিকে অবৈধভাবে মেমরির অবস্থানগুলি উল্লেখ করা থেকে বিরত করা এবং জাভা ভার্চুয়াল মেশিন দ্বারা আবর্জনা সংগ্রহের ব্যবস্থা স্বয়ংক্রিয়ভাবে চালিত করা সক্ষম করে।
আপনি অনিরাপদ বর্গ ব্যবহার করে ঠিকানা এবং পয়েন্টার ব্যবহার করতে পারেন। তবে নামটি যেমন বোঝায়, এই পদ্ধতিগুলি আনসাফ এবং সাধারণত একটি খারাপ ধারণা। ভুল ব্যবহারের ফলে আপনার জেভিএম এলোমেলোভাবে মারা যায় (আসলে একই সমস্যা সি / সি ++ তে ভুল পয়েন্টার ব্যবহার করা)
আপনি পয়েন্টারগুলিতে অভ্যস্ত হয়ে থাকতে পারেন এবং আপনার তাদের প্রয়োজন মনে করে (কারণ আপনি কীভাবে অন্য কোনও কোড কোড করবেন তা জানেন না) তবে আপনি দেখতে পাবেন যে আপনি এটি করেন নি এবং আপনি এটির জন্য আরও ভাল থাকবেন।
প্রযুক্তিগতভাবে, সমস্ত জাভা অবজেক্ট পয়েন্টার। সমস্ত আদিম ধরণের মান যদিও। এই পয়েন্টারগুলির ম্যানুয়াল নিয়ন্ত্রণ নেওয়ার কোনও উপায় নেই। জাভা কেবল অভ্যন্তরীণভাবে পাস-বাই-রেফারেন্স ব্যবহার করে।
আসলেই না, না।
জাভা পয়েন্টার নেই। আপনি যদি সত্যিই চেয়েছিলেন আপনি প্রতিবিম্বের মতো কিছু তৈরি করে এগুলি অনুকরণ করার চেষ্টা করতে পারেন তবে এতে কোনও উপকারিতা ছাড়াই পয়েন্টারগুলির জটিলতা রয়েছে ।
জাভা পয়েন্টার নেই কারণ এটি তাদের প্রয়োজন হয় না। আপনি এই প্রশ্নটি থেকে কী ধরণের উত্তরের জন্য প্রত্যাশা করছেন, অর্থাত্ গভীরভাবে আপনি কী আশা করেছিলেন যে আপনি সেগুলি কোনও কিছুর জন্য ব্যবহার করতে পারবেন বা এটি কেবল কৌতূহল?
জাভাতে সমস্ত বস্তু আদিমগুলি বাদে রেফারেন্স কপির মাধ্যমে ফাংশনে প্রেরণ করা হয়।
বাস্তবে, এর অর্থ হ'ল আপনি পয়েন্টারের একটি অনুলিপি মূল বস্তুটিতে পাঠিয়ে দিচ্ছেন না বরং বস্তুর নিজেই অনুলিপি করছেন।
আপনি যদি এটি বুঝতে কোনও উদাহরণ চান তবে দয়া করে একটি মন্তব্য দিন।
swap
জাভাতে কোনও ফাংশন লিখতে পারবেন না যা দুটি অবজেক্টকে বদল করবে।
অন্যরা যেমন বলেছে, সংক্ষিপ্ত উত্তরটি "না"।
অবশ্যই, আপনি জেএনআই কোড লিখতে পারেন যা জাভা পয়েন্টারগুলির সাথে খেলে। আপনি কী অর্জন করতে চাইছেন তার উপর নির্ভর করে, সম্ভবত এটি আপনাকে কোথাও পেয়েছে এবং সম্ভবত তা করবে না।
আপনি সর্বদা বিন্যাস তৈরি করে অ্যারে তৈরি করে এবং সূচীর সাথে অ্যারেতে কাজ করতে পারেন। আবার আপনি কী অর্জন করতে চাইছেন তার উপর নির্ভর করে এটি কার্যকর হতে পারে বা নাও পারে।
গডফ্রে নোলানের ডেকম্পিলিং অ্যান্ড্রয়েড নামের বইটি থেকে
সুরক্ষা নির্দেশ করে যে জাভাতে পয়েন্টার ব্যবহার করা হয় না তাই হ্যাকাররা কোনও অ্যাপ্লিকেশন এবং অপারেটিং সিস্টেমের বাইরে বেরিয়ে আসতে পারে না। কোন পয়েন্টার মানে না যে অন্য কিছু ---- এই ক্ষেত্রে, জেভিএম ---- বরাদ্দকরণ এবং মেমরি মুক্ত করার যত্ন নিতে হবে। মেমরি ফাঁসও অতীতের জিনিস হয়ে উঠতে হবে, বা তত্ত্বটি যায়। সি এবং সি ++ তে লিখিত কিছু অ্যাপ্লিকেশনগুলি চালনার মতো মেমরি ফাঁস করার জন্য কুখ্যাত হয় কারণ প্রোগ্রামাররা উপযুক্ত সময়ে অযাচিত স্মৃতি মুক্ত করার দিকে মনোযোগ দেয় না ---- এটি নয় যে এটি পড়ার কেউ এই ধরনের পাপের জন্য দোষী হবে। ময়লা সমস্যা ডিবাগ করতে কম সময় ব্যয় করে প্রোগ্রামারদের আরও মজাদার সংগ্রহ করা উচিত G
আপনার আক্ষরিক জন্য পয়েন্টার থাকতে পারে। এগুলি আপনাকে নিজেই প্রয়োগ করতে হবে। এটি বিশেষজ্ঞদের জন্য বেশ বেসিক;)। পয়েন্টার বাস্তবায়নের জন্য আপনার কাছে বেস / অবজেক্ট / লং / বাইট এবং ভয়েলা এর অ্যারে ব্যবহার করুন। এখন যে কোনও ইনট মানটি সেই অ্যারে ইন্ট [] এর পয়েন্টার হতে পারে। আপনি পয়েন্টারটি বৃদ্ধি করতে পারবেন, আপনি পয়েন্টারটি হ্রাস করতে পারবেন, আপনি পয়েন্টারকে গুণ করতে পারবেন। আপনার কাছে পয়েন্টার গাণিতিক আছে! 1000 ইনট্রিবিউট ক্লাস প্রয়োগ করা এবং একটি জেনেরিক পদ্ধতি রয়েছে যা সমস্ত বৈশিষ্ট্যের ক্ষেত্রে প্রযোজ্য। আপনি কোনও ইনট এর পরিবর্তে বাইট [] অ্যারেও ব্যবহার করতে পারেন []
তবে আমি চাই জাভা আপনাকে রেফারেন্স দ্বারা আক্ষরিক মানগুলি পাস করতে দেয়। লাইন বরাবর কিছু
//(* telling you it is a pointer)
public void myMethod(int* intValue);
সমস্ত জাভা অবজেক্ট পয়েন্টার কারণ একটি ভেরিয়েবল যা ঠিকানা রাখে তাকে পয়েন্টার এবং অবজেক্ট হোল্ড অ্যাড্রেস বলে। সুতরাং অবজেক্ট পয়েন্টার ভেরিয়েবল।