1. রেফারেন্স ভেরিয়েবল

জাভা ভাষায়, দুটি ধরণের ভেরিয়েবল রয়েছে: আদিম ভেরিয়েবল এবং অন্য সবকিছু। যেহেতু এটি ঘটে, আমরা এখন "অন্য সবকিছু" সম্পর্কে কথা বলতে যাচ্ছি।

আসলে, এটা বলা আরও সঠিক হবে যে আদিম ভেরিয়েবল এবং রেফারেন্স ভেরিয়েবল আছে । তাই এই রেফারেন্স ভেরিয়েবল কি?

আদিম প্রকারের বিপরীতে, যার ভেরিয়েবলগুলি সরাসরি মান সংরক্ষণ করে, রেফারেন্স ভেরিয়েবলগুলি বস্তুর রেফারেন্স সংরক্ষণ করে। অর্থাৎ, মেমরিতে কোথাও একটি অবজেক্ট আছে এবং রেফারেন্স ভেরিয়েবল কেবল এই অবজেক্টের ঠিকানা মেমরিতে সংরক্ষণ করে (অবজেক্টের একটি রেফারেন্স)।

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

একটি অ্যারে এবং একটি স্ট্রিং উভয়ই মেমরিতে কোথাও সংরক্ষিত বস্তু। Stringভেরিয়েবল এবং অ্যারে ভেরিয়েবল শুধুমাত্র বস্তুর রেফারেন্স সংরক্ষণ করে।

জাভাতে রেফারেন্স ভেরিয়েবল

int a, int b and double dআদিম ভেরিয়েবল যা তাদের মান নিজেদের মধ্যে সঞ্চয় করে।

একটি পরিবর্তনশীল একটি রেফারেন্স এবং মেমরিতে String strএকটি বস্তুর ঠিকানা (রেফারেন্স) সংরক্ষণ করে ।String

একটি আদিম প্রকারের একটি ভেরিয়েবলে একটি আদিম মান নির্ধারণ করার সময়, এর মানটি অনুলিপি করা হয় (ডুপ্লিকেটেড)। একটি রেফারেন্স ভেরিয়েবল বরাদ্দ করার সময়, শুধুমাত্র বস্তুর ঠিকানা অনুলিপি করা হয়বস্তুটি নিজেই অনুলিপি করা হয় না


2. সব সম্পর্কে রেফারেন্স কি?

রেফারেন্স ভেরিয়েবল এবং আদিম ভেরিয়েবলের মধ্যে মৌলিক পার্থক্য কি?

একটি আদিম পরিবর্তনশীল একটি বাক্সের মত: আপনি এটিতে কিছু মান সঞ্চয় করতে পারেন। একটি রেফারেন্স ভেরিয়েবল অনেকটা কাগজের টুকরো এর মত যার উপর একটি ফোন নম্বর থাকে।

একটি গাড়ি বনাম গাড়ির চাবি

কল্পনা করুন যে আপনি আপনার বন্ধুকে তার জন্মদিনের জন্য একটি গাড়ি দেওয়ার সিদ্ধান্ত নিয়েছেন। আপনি এটিকে একটি বাক্সে মুড়িয়ে আপনার সাথে বহন করবেন না: গাড়িটি তার জন্য খুব বড়।

গাড়ির চাবিগুলিকে ধারণ করার জন্য যথেষ্ট বড় একটি বাক্সে উপস্থাপন করা অনেক বেশি সুবিধাজনক। আপনার বন্ধু বাক্স থেকে চাবি বের করলেই সব বুঝতে পারবে। আপনি যখন কেবল চাবি হস্তান্তর করতে পারেন তখন পুরো গাড়িটি আপনার সাথে বহন করার দরকার নেই।

একজন ব্যক্তি বনাম তার ফোন নম্বর

অথবা এখানে আরেকটি তুলনা: একজন ব্যক্তি এবং তার ফোন নম্বর। একটি ফোন নম্বর ব্যক্তি নয়, তবে একটি ফোন নম্বর তাকে কল করতে, কিছু তথ্যের জন্য জিজ্ঞাসা করতে বা নির্দেশাবলী প্রদান করতে ব্যবহার করা যেতে পারে।

একইভাবে, একটি রেফারেন্স একটি বস্তুর সাথে যোগাযোগ করতে ব্যবহৃত হয়। সমস্ত বস্তু রেফারেন্স ব্যবহার করে একে অপরের সাথে যোগাযোগ করে। "মানুষ বিনিময়" এর পরিবর্তে, আমরা কেবল ফোন নম্বর বিনিময় করি।

একটি আদিম ভেরিয়েবলের একটি মান নির্ধারণ করার সময়, এর মানটি অনুলিপি করা হয় (সদৃশ)। একটি রেফারেন্স ভেরিয়েবলের একটি মান নির্ধারণ করার সময়, শুধুমাত্র বস্তুর ঠিকানা (ফোন নম্বর) অনুলিপি করা হয় - বস্তুটি নিজেই অনুলিপি করা হয় না।

একটি রেফারেন্স আরও একটি সুবিধা দেয়: আপনি কিছু পদ্ধতিতে একটি অবজেক্টের রেফারেন্স পাস করতে পারেন, এবং পদ্ধতিটি অবজেক্টের রেফারেন্স ব্যবহার করে, এর পদ্ধতিগুলি কল করে এবং অবজেক্টের ভিতরে ডেটা অ্যাক্সেস করে এটিকে সংশোধন (পরিবর্তন) করতে সক্ষম হবে।


3. রেফারেন্স বরাদ্দ করা

রেফারেন্স ভেরিয়েবল বরাদ্দ করার সময়, মেমরিতে শুধুমাত্র বস্তুর ঠিকানা বরাদ্দ করা হয়। বস্তু নিজেই প্রদর্শিত বা অদৃশ্য হয় না.

এই পদ্ধতিটি প্রচুর পরিমাণে মেমরি অনুলিপি করা এড়ায়। আপনি যদি একটি পদ্ধতিতে একটি খুব বড় বস্তু পাস করতে চান, আমরা শুধু অবজেক্ট রেফারেন্স পাস এবং এটি. রেফারেন্স অনেক কম জায়গা নেয়।

রেফারেন্স বরাদ্দ করা

সমস্ত রেফারেন্স ভেরিয়েবলের আকার (তাদের প্রকার নির্বিশেষে) একই — 4 বাইট (একটি int এর মতো)। কিন্তু! যদি আপনার অ্যাপ্লিকেশনটি একটি 64-বিট জাভা মেশিনে চলছে, তবে সমস্ত রেফারেন্স 8 বাইট (64 বিট) আকারের হবে।

আরও কী, রেফারেন্সগুলি কেবল একে অপরকে বরাদ্দ করা যেতে পারে। আপনি রেফারেন্স পরিবর্তন করতে পারবেন না বা রেফারেন্স ভেরিয়েবলে নির্বিচারে মান নির্ধারণ করতে পারবেন না:

কোড বর্ণনা
String hello = "Hello";
String s = hello;
এটি অনুমোদিত
String hello = "Hello";
hello++;
কিন্তু এটা অনুমোদিত নয়
String hello = 0x1234;
এবং এটি অনুমোদিত নয়

4. একটি nullরেফারেন্স

এবং কি একটি রেফারেন্স ভেরিয়েবল সঞ্চয় করে যদি কিছুই এখনও এটি বরাদ্দ করা হয়েছে?

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

সমস্ত রেফারেন্স ভেরিয়েবল হল nullযদি না তাদের নির্দিষ্ট ধরণের রেফারেন্স থাকে।

উদাহরণ:

কোড বর্ণনা
class Person
{
   public static String name;
   public static int age;
}


ভেরিয়েবলের String nameএকটি ডিফল্ট মান আছে: null.
ভেরিয়েবলের int ageএকটি ডিফল্ট মান আছে: 0.

স্থানীয় ভেরিয়েবল যেগুলিকে একটি মান বরাদ্দ করা হয়নি সেগুলিকে আদিম এবং রেফারেন্স উভয় প্রকারের জন্য অপ্রাথমিক হিসাবে বিবেচনা করা হয়।

যদি একটি ভেরিয়েবল কিছু বস্তুর একটি রেফারেন্স সঞ্চয় করে, এবং আপনি ভেরিয়েবলের মানটি পরিষ্কার করতে চান, তাহলে এটিকে একটি নাল রেফারেন্স বরাদ্দ করুন।

কোড বর্ণনা
String s = null;
s = "Hello";
s = null;
sদোকান null_ একটি স্ট্রিং অবজেক্ট স্টোরের
sএকটি রেফারেন্স সঞ্চয় করে ।
snull

5. পদ্ধতির রেফারেন্স পাস করা

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

উদাহরণ:

কোড বর্ণনা
class Solution
{
   public static void fill(String[] array, String value)
   {
      for (int i = 0; i < array.length; i++)
        array[i] = value;
   }

   public static void main(String[] args)
   {
     String[] data = new String[10];
     fill(data, "Hello");
   }
}


পাস করা মান ( ) দিয়ে fillপাস করা অ্যারে ( ) পূরণ করে ।arrayvalue

যখন fillপদ্ধতিটি বলা হয়, arrayতখন প্যারামিটারটিকে অ্যারের একটি রেফারেন্স বরাদ্দ করা হয় data। ভেরিয়েবলটিকে valueস্ট্রিং অবজেক্টের ("হ্যালো") একটি রেফারেন্স দেওয়া হয়েছে।

পদ্ধতিটি কল করার আগে মেমরির মতো দেখায় fill:

পদ্ধতির রেফারেন্স পাস করা

যখন fill পদ্ধতিটি চলছে তখন মেমরির মতো দেখায় :

পদ্ধতি 2 এর রেফারেন্স পাস করা

dataএবং ভেরিয়েবলগুলি arrayমেমরিতে একই ধারককে (স্টোর রেফারেন্স) উল্লেখ করে।

ভেরিয়েবলটি valueস্ট্রিং অবজেক্ট ( "Hello") এর একটি রেফারেন্স সঞ্চয় করে।

অ্যারের কোষগুলিও বস্তুর রেফারেন্স সংরক্ষণ করে "Hello"

প্রকৃতপক্ষে, কোন অবজেক্ট ডুপ্লিকেট করা হয় না - শুধুমাত্র রেফারেন্স কপি করা হয়।



6. C/C ++ ভাষার সাথে তুলনা

সাক্ষাত্কারে, কখনও কখনও জাভা প্রোগ্রামারদের জিজ্ঞাসা করা হয় কিভাবে জাভা পদ্ধতিতে ডেটা পাস করা হয়? এবং কখনও কখনও প্রশ্ন হয় তথ্য রেফারেন্স বা মান দ্বারা পাস হয় কিনা?

এই প্রশ্নটি C++ থেকে এসেছে, কিন্তু Java এ খুব অর্থপূর্ণ নয় । জাভাতে, প্যারামিটারগুলিকে সর্বদা সহজভাবে আর্গুমেন্টের মান নির্ধারণ করা হয়। তাই সঠিক উত্তর হবে " মান অনুযায়ী "।

কিন্তু আপনার অবস্থান ব্যাখ্যা করার জন্য প্রস্তুত থাকুন , যেহেতু আপনি অবিলম্বে প্রতিশোধ শুনতে পারেন: "আদিম প্রকারগুলি মান দ্বারা পাস হয়, এবং রেফারেন্সের প্রকারগুলি রেফারেন্স দ্বারা পাস হয়।"

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

জাভাতে, সবকিছুই দ্ব্যর্থহীন: আদিম প্রকার সঞ্চয় মান এবং রেফারেন্স প্রকারগুলিও একটি মান সঞ্চয় করে - একটি রেফারেন্স। এটি একটি প্রশ্ন যে একটি পরিবর্তনশীল একটি মান হিসাবে বিবেচিত হয় কিনা ।

C++ এ, একটি ভেরিয়েবল একটি অবজেক্ট এবং অবজেক্টের রেফারেন্স উভয়ই সঞ্চয় করতে পারে। আদিম প্রকারের ক্ষেত্রেও একই কথা সত্য: একটি আদিম ভেরিয়েবল একটি মান সঞ্চয় করতে পারে বা ভেরিয়েবলটিকে একটি রেফারেন্স হিসাবে ঘোষণা করতে পারে int। সুতরাং, বিভ্রান্তি এড়াতে, C++ প্রোগ্রামাররা সর্বদা একটি রেফারেন্স হিসাবে একটি রেফারেন্স হিসাবে বস্তুর উল্লেখ করে এবং বস্তুটি নিজেই - একটি মান হিসাবে।

C++ এ, আপনি সহজেই এমন পরিস্থিতি পেতে পারেন যেখানে একটি ভেরিয়েবল একটি বস্তু ধারণ করে, কিন্তু অন্যটিতে সেই বস্তুর একটি রেফারেন্স রয়েছে। তদনুসারে, একটি ভেরিয়েবল কি সঞ্চয় করে - বস্তুটি নিজেই বা এটির একটি রেফারেন্স - খুব গুরুত্বপূর্ণ ছিল। যখন একটি বস্তু একটি পদ্ধতিতে পাস করা হয়, এটি অনুলিপি করা হয় (যদি মান দ্বারা পাস করা হয়), এবং অনুলিপি করা হয় না (যদি রেফারেন্স দ্বারা পাস করা হয়)।

জাভাতে, এই দ্বৈততা বিদ্যমান নেই, তাই সঠিক উত্তর হল: আর্গুমেন্টগুলি মান দ্বারা জাভা পদ্ধতিতে পাস করা হয় । এটা ঠিক যে যখন আমরা রেফারেন্স ভেরিয়েবল সম্পর্কে কথা বলছি, এই মানটি একটি রেফারেন্স।