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

"তুমি আমার আগ্রহ জাগিয়েছ, দিয়েগো... একটি নতুন বিষয়?"

"প্রতিটি বিষয় আপনার জন্য নতুন, আমার তরুণ রোবট! এবং এটি একটি ব্যতিক্রম নয়। যদিও এটি আবার পদ্ধতি সম্পর্কে। আপনি সম্ভবত ইতিমধ্যেই লক্ষ্য করেছেন যে পদ্ধতিগুলি থেকে আমরা পদ্ধতিতে আর্গুমেন্ট পাস করতে পারি। একবার আমরা পদ্ধতির 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বিভিন্ন পরামিতি সহ পদ্ধতিটিকে কল করি

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

যুক্তি

"আমি চাই আপনি প্যারামিটার আছে এমন কলিং পদ্ধতিতে বিশেষ মনোযোগ দিন৷ পদ্ধতিতে পাস করা মানগুলিকে সাধারণত আর্গুমেন্ট বলা হয় যখন সেগুলি পদ্ধতিতে পাস করা হয়৷

আসুন আমাদের উদাহরণটি আরও একবার দেখে নেওয়া যাক:

কোড ব্যাখ্যা
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নিজেদেরকে আর্গুমেন্ট বলা হয়।"

"আমি পার্থক্যটি মনে রাখার চেষ্টা করব এবং এই ধারণাগুলিকে বিভ্রান্ত করব না।"

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

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

"ওয়েল, এটা বোঝা যায়!"

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

কোড ব্যাখ্যা
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";
     String 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";
     String count = 10;
     printLines(text, count);
   }
}

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

পদ্ধতিটি স্ট্রিং text countবার প্রদর্শন করে



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

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

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

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

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

"এখন আমি জানি."

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

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

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

"যখন একজন ডেভেলপার একটি অ্যারে ভেরিয়েবলকে অন্য অ্যারে ভেরিয়েবল বরাদ্দ করে, তখন কী হয়?"

"তাহলে কি তারা একই ঠিকানায় নির্দেশ করে?"

"সঠিক। দুটি ভেরিয়েবল মেমরিতে একই স্থান নির্দেশ করতে শুরু করে:

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

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


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

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

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

"আমার অনুমান আমি বুঝতে পেরেছি, কিন্তু আমার আরও উদাহরণ দরকার!"

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

কোড ব্যাখ্যা
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

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

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

"নাম সম্পর্কে আর কি বলা যেতে পারে আমি কল্পনা করতে পারি না!"

"ঠিক আছে, জাভা ভাষার স্ট্যান্ডার্ডের জন্য একই ক্লাসের সমস্ত পদ্ধতির অনন্য নাম থাকা প্রয়োজন।

"তাহলে, একই ক্লাসে দুটি অভিন্ন নামকরণ পদ্ধতি ঘোষণা করা অসম্ভব?"

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

কোড ব্যাখ্যা
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()StringSystem.out.println(1.0)println()double

আহ, এটা মাধ্যমে পেতে শুরু করা মনে হচ্ছে!

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

"এবং আমি অনুমান করি যে কেন একটি পদ্ধতির স্বতন্ত্রতা নির্ধারণ করার সময় তাদের বিবেচনা করা হয় না?"

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

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

"ভাল করেছেন, অ্যামিগো! আপনি এই পাঠটি নিখুঁতভাবে সংক্ষিপ্ত করেছেন। যদি কিছু অস্পষ্ট থেকে যায়, তাহলে ঘাবড়াবেন না। এই বিষয়টি কয়েকটি কাজের পরে পরিষ্কার হয়ে যাবে।"