1. পাশ আর্গুমেন্ট

এবং এখন মজা শুরু হয়. আপনি সম্ভবত ইতিমধ্যে পদ্ধতি থেকে জানেন System.out.println()যে আমরা পদ্ধতিতে আর্গুমেন্ট পাস করতে পারি। একবার আমরা পদ্ধতির ভিতরে থাকি, আমরা সেগুলিকে পরামিতি হিসাবে উল্লেখ করি। আসলে, প্যারামিটারগুলি পদ্ধতিগুলি তৈরি এবং ব্যবহার করে আমরা যে সুবিধাগুলি পাই তা ব্যাপকভাবে বৃদ্ধি করে৷

আমরা কিভাবে প্যারামিটার সহ একটি পদ্ধতি ঘোষণা করব? এটা আসলে বেশ সহজ:

public static void name(parameters)
{
  method body
}

যেখানে name পদ্ধতির অনন্য নাম এবং method body কমান্ডগুলিকে উপস্থাপন করে যা পদ্ধতিটি তৈরি করে। এবং parameters কমা দ্বারা পৃথক করা পদ্ধতি পরামিতিগুলির জন্য একটি স্থানধারক। আসুন এই টেমপ্লেটটি আরও বিশদে বর্ণনা করি:

public static void name(Type1 name1, Type2 name2, Type3 name3)
{
  method body
}

উদাহরণ:

কোড ব্যাখ্যা
public static void print(String str)
{
}
পদ্ধতি printএকটি পরামিতি সঙ্গে ঘোষণা করা হয়:
String str
public static void print(String str, int count)
{
}
পদ্ধতি printদুটি পরামিতি সঙ্গে ঘোষণা করা হয়:
String str
int count
public static void write(int x, int y)
{
}
পদ্ধতি writeদুটি পরামিতি সঙ্গে ঘোষণা করা হয়:
int x
int y

যদি আমরা পদ্ধতিতে প্যারামিটার না রাখতে চাই, তাহলে আমরা শুধু বন্ধনীগুলো খালি রাখি।

পরামিতি হল একটি পদ্ধতির মধ্যে বিশেষ ভেরিয়েবল। তাদের সাহায্যে, আপনি পদ্ধতিতে বিভিন্ন মান পাস করতে পারেন যখন এটি বলা হয়।

উদাহরণস্বরূপ, আসুন একটি পদ্ধতি লিখি যা একটি নির্দিষ্ট সংখ্যক পাঠ্যের স্ট্রিং প্রদর্শন করে।

আপনি ইতিমধ্যেই জানেন কিভাবে স্ক্রীনে একটি স্ট্রিং প্রদর্শন করতে কোড লিখতে হয় কয়েকবার। কিন্তু কোন স্ট্রিং আপনি মুদ্রণ করা উচিত? আর কতবার? যে জন্য আমরা পরামিতি প্রয়োজন কি.

যে কোডটি এটি করে তা দেখতে এইরকম হবে:

কোড ব্যাখ্যা
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Hi", 10);
     printLines("Bye", 20);
   }
}


আমরা printLinesনিম্নলিখিত পরামিতিগুলির সাথে পদ্ধতিটি ঘোষণা করি:
String text, int count
পদ্ধতিটি স্ট্রিং text countসময় প্রদর্শন করে





আমরা printLinesবিভিন্ন পরামিতি সহ পদ্ধতিটিকে কল করি

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


2. যুক্তি

আমি পরামিতি সহ একটি পদ্ধতি কল করার জন্য আপনার দৃষ্টি আকর্ষণ করতে চাই।

পদ্ধতিতে পাস করা মানগুলিকে সাধারণত আর্গুমেন্ট বলা হয় যখন সেগুলি পদ্ধতিতে পাস করা হয়।

আসুন আরেকটি উদাহরণ দেখি:

কোড ব্যাখ্যা
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Hi", 10);
     printLines("Bye", 20);
   }
}


আমরা printLinesনিম্নলিখিত পরামিতি সহ পদ্ধতিটি ঘোষণা করেছি:
String text, int count
পদ্ধতিটি স্ট্রিং text countবার প্রদর্শন করে




আমরা printLinesনিম্নলিখিত আর্গুমেন্ট সহ পদ্ধতিটিকে কল করি:
text = "Hi"; count = 10;
text = "Bye"; count = 20;

যখন printLines পদ্ধতিটি প্রথমবার কল করা হয়েছিল, তখন এর পরামিতিগুলিকে নিম্নলিখিত মানগুলি বরাদ্দ করা হয়েছিল:
String text = "Hi", int count = 10.

যখন printLinesপদ্ধতিটিকে দ্বিতীয়বার বলা হয়েছিল, তখন এর পরামিতিগুলিকে বিভিন্ন মান বরাদ্দ করা হয়েছিল:
String text = "Bye", int count = 20.

প্যারামিটারগুলি ভেরিয়েবলের চেয়ে কম নয় যেগুলিকে নির্দিষ্ট মান নির্ধারণ করা হয় যখন একটি পদ্ধতি বলা হয়। মান "Hi", "Bye", 10, এবং 20নিজেদেরকে আর্গুমেন্ট বলা হয়।"


3. একটি পদ্ধতি কল করার সময় পরস্পরবিরোধী পরিবর্তনশীল নাম

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

কোড ব্যাখ্যা
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String str = "Hi";
     int n = 10;
     printLines(str, n);
   }
}


আমরা printLinesনিম্নলিখিত পরামিতি সহ পদ্ধতিটি ঘোষণা করেছি:
String text, int count
পদ্ধতিটি স্ট্রিং text countবার প্রদর্শন করে







আমরা printLinesনিম্নলিখিত আর্গুমেন্ট সহ পদ্ধতিটিকে কল করি:
text = str;
count = n;

এখন পর্যন্ত, তাই ভাল: আমরা একটি strপরিবর্তনশীল আছে. textযখন পদ্ধতিটি কল করা হয় তখন এর মানটি প্যারামিটারে নির্ধারিত হয় । আমরা একটি nপরিবর্তনশীল আছে. countযখন পদ্ধতিটি বলা হয় তখন এর মানটি প্যারামিটারে বরাদ্দ করা হয় ।" এখন পর্যন্ত, সবকিছু পরিষ্কার।

এখন পদ্ধতিতে আমাদের ভেরিয়েবলের নাম পরিবর্তন করা যাক main:

কোড ব্যাখ্যা
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String text = "Hi";
     int count = 10;
     printLines(text, count);
   }
}


আমরা printLinesনিম্নলিখিত পরামিতি সহ পদ্ধতিটি ঘোষণা করেছি:
String text, int count
পদ্ধতিটি স্ট্রিং text countবার প্রদর্শন করে







আমরা printLinesনিম্নলিখিত আর্গুমেন্ট সহ পদ্ধতিটিকে কল করি:
text = text;
count = count;

দুটি বিষয়ে মনোযোগ দিন

প্রথম: আমাদের বিভিন্ন পদ্ধতিতে একই নামের ভেরিয়েবল রয়েছে। এগুলি বিভিন্ন পরিবর্তনশীল (আমরা ইচ্ছাকৃতভাবে বিভিন্ন রঙ ব্যবহার করে তাদের চিত্রিত করি)। সবকিছু আগের উদাহরণের মতোই কাজ করে, যেখানে পদ্ধতির ভেরিয়েবলের mainনাম ছিল strএবং n.

দ্বিতীয়: পদ্ধতিটি বলা হলে যাদুকর কিছুই ঘটে না। পরামিতিগুলিকে কেবল যুক্তির মান নির্ধারণ করা হয়। সেগুলি সংখ্যা, স্ট্রিং, ভেরিয়েবল বা এক্সপ্রেশন যাই হোক না কেন।

আমরা মূল পদ্ধতিতে ভেরিয়েবলের নাম পরিবর্তন করার পরে, কিছুই পরিবর্তন হয়নি। তারা আগে বিভিন্ন পদ্ধতিতে বিভিন্ন ভেরিয়েবল ছিল , এবং তাই তারা রয়ে গেছে। text এবং ভেরিয়েবলের মধ্যে কোন জাদু সংযোগ নেই text ।



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

আমি আশা করি আপনি আগের পাঠ থেকে সবকিছু বুঝতে পেরেছেন, কারণ এখন আমরা পদ্ধতিতে আর্গুমেন্ট পাস করার পুনর্বিবেচনা করতে যাচ্ছি, শুধুমাত্র আমরা আরও গভীরে ডুব দেব।

আপনি ইতিমধ্যেই জানেন, কিছু জাভা ভেরিয়েবল নিজেরাই মান সংরক্ষণ করে না, বরং একটি রেফারেন্স, যেমন মেমরির ব্লকের ঠিকানা যেখানে মানগুলি অবস্থিত। এভাবেই স্ট্রিং ভেরিয়েবল এবং অ্যারে ভেরিয়েবল কাজ করে।

আপনি যখন একটি অ্যারে ভেরিয়েবলে অন্য অ্যারে ভেরিয়েবল বরাদ্দ করেন, তখন কী হয়? সেটা ঠিক. দুটি ভেরিয়েবল মেমরিতে একই স্থান উল্লেখ করতে শুরু করে:

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

এবং কি হবে যদি এই ভেরিয়েবলগুলির একটি একটি পদ্ধতি পরামিতি হয়?

কোড ব্যাখ্যা
class Solution
{
   public static void printArraySum(int[] data)
   {
     int sum = 0;
     for (int i = 0; i < data.length; i++)
       sum = sum + data[i];
     System.out.println(sum);
   }
   
   public static void main(String[] args)
   {
     int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30};
     printArraySum(months);
   }
}


পদ্ধতিটি printArraySumপাস করা অ্যারের সংখ্যার যোগফল গণনা করে এবং এটি স্ক্রিনে প্রদর্শন করে

ঠিক একই জিনিস ঘটে: প্যারামিটারে ভেরিয়েবলের data মতো মেমরির একই এলাকার একটি রেফারেন্স থাকবে । monthsযখন পদ্ধতিটি বলা হয়, তখন একটি সাধারণ অ্যাসাইনমেন্ট ঘটে: .data = months

এবং যেহেতু উভয় ভেরিয়েবল একটি পূর্ণসংখ্যা সংরক্ষণ করার মেমরির একই ক্ষেত্রকে নির্দেশ করে, তাই printArraySum পদ্ধতিটি কেবল অ্যারে থেকে মানগুলি পড়তে পারে না, তবে সেগুলিকেও পরিবর্তন করতে পারে!

উদাহরণস্বরূপ, আমরা আমাদের নিজস্ব পদ্ধতি লিখতে পারি যা একই মান সহ একটি দ্বি-মাত্রিক অ্যারে পূরণ করে। এটি দেখতে কেমন হতে পারে:

কোড ব্যাখ্যা
class Solution
{
   public static void fill(int[][] data, int value)
   {
     for (int i = 0; i < data.length; i++)
     {
       for (int j = 0; j < data[i].length; j++)
         data[i][j] = value;
     }
  }

   public static void main(String[] args)
   {
     int[][] months = {{31, 28}, {31, 30, 31}, {30, 31, 31}};
     fill (months, 8);
   }
}


পদ্ধতিটি fill পাস করা দ্বি-মাত্রিক অ্যারের প্রতিটি কক্ষের উপর পুনরাবৃত্তি করে এবং valueতাদের বরাদ্দ করে।








আমরা একটি দ্বি-মাত্রিক অ্যারে তৈরি করি।
আমরা সংখ্যা দিয়ে পুরো অ্যারে পূরণ করি 8


5. একই নামের পদ্ধতি

এখন আবার পদ্ধতির নামগুলিতে ফিরে আসা যাক।

জাভা স্ট্যান্ডার্ডের জন্য একই ক্লাসের সমস্ত পদ্ধতির অনন্য নাম থাকা প্রয়োজন। অন্য কথায়, একই ক্লাসে দুটি অভিন্ন নামকরণ পদ্ধতি ঘোষণা করা অসম্ভব।

যখন একইতার জন্য পদ্ধতিগুলি তুলনা করা হয়, তখন শুধুমাত্র নামগুলিই বিবেচনায় নেওয়া হয় না, প্যারামিটারগুলির প্রকারগুলিও বিবেচনা করা হয় ! নোট করুন যে প্যারামিটারগুলির নামগুলি বিবেচনায় নেওয়া হয় না । উদাহরণ:

কোড ব্যাখ্যা
void fill(int[] data, int value) {
}
void fill(int[][] data, int value) {
}
void fill(int[][][] data, int value)  {
}
এই তিনটি পদ্ধতি ভিন্ন পদ্ধতি। তারা একই ক্লাসে ঘোষণা করা যেতে পারে।
void print(String str) {
}
void print(String str, String str2) {
}
void print(int val) {
}
void print(double val) {
}
void print() {
}
এই পাঁচটি পদ্ধতির প্রতিটিকে আলাদা বলে মনে করা হয় । তারা একই ক্লাসে ঘোষণা করা যেতে পারে।
void sum(int x, int y) {
}
void sum(int data, int value) {
}
এই দুটি পদ্ধতি একই হিসাবে বিবেচিত হয় , যার অর্থ তারা একই ক্লাসে ঘোষণা করা যায় না।

কেন কিছু পদ্ধতি একই হিসাবে বিবেচিত হয় , যখন অন্যগুলি ভিন্ন ? এবং একটি পদ্ধতির স্বতন্ত্রতা নির্ধারণ করার সময় প্যারামিটারের নামগুলি কেন বিবেচনায় নেওয়া হয় না?

কেন স্বতন্ত্রতা আদৌ প্রয়োজনীয়? ব্যাপারটি হল যে কম্পাইলার যখন একটি প্রোগ্রাম কম্পাইল করে, তখন এটি অবশ্যই জানতে হবে যে আপনি কোন নির্দিষ্ট জায়গায় কল করতে চান।

উদাহরণ স্বরূপ, আপনি যদি লেখেন , কম্পাইলারটি স্মার্ট এবং সহজেই উপসংহারে পৌঁছাবে যে আপনি এখানে একটি প্যারামিটার সহ পদ্ধতিটিকে কল করতে চান।System.out.println("Hi")println()String

কিন্তু আপনি লিখলে , কম্পাইলার একটি প্যারামিটার সহ পদ্ধতিতে একটি কল দেখতে পাবে।System.out.println(1.0)println()double

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

একটি পদ্ধতির নাম এবং এর পরামিতিগুলির প্রকারগুলিকে পদ্ধতি স্বাক্ষর বলা হয় । উদাহরণ স্বরূপ,sum(int, int)

প্রতিটি ক্লাসে অনন্য নামের পদ্ধতির পরিবর্তে অনন্য স্বাক্ষর সহ পদ্ধতি থাকতে হবে ।