"হ্যালো, অ্যামিগো! কয়েকদিন আগে আমি তোমাকে ওভারলোডিং পদ্ধতির কথা বলেছিলাম। তুমি কি সব বুঝতে পেরেছ?"

"হ্যাঁ। আমার মনে আছে। প্রতিটি ক্লাসের পদ্ধতি অবশ্যই অনন্য হতে হবে। যদি ক্লাসে একই নাম এবং পরামিতি প্রকারের (এবং পরামিতিগুলির ক্রম গুরুত্বপূর্ণ) সহ অন্য কোনও পদ্ধতি না থাকে তবে একটি সদস্য পদ্ধতি অনন্য।"

"খুব ভাল! আমি দেখছি আপনি সেই পাঠটি ভালভাবে শিখেছেন। আজ আমি এই বিষয়ে আপনার জ্ঞানকে একটু প্রসারিত করতে চাই। প্রতিটি ক্ষেত্রে কী পদ্ধতি বলা হবে বলে আপনি মনে করেন?"

কোড
class Cat
{
 public static void print(int n)
 {
  System.out.println(n);
 }
 public static void print(short n)
 {
  System.out.println(n);
 }
 public static void print(Integer n)
 {
  System.out.println(n);
 }
 public static void print(String s)
 {
  System.out.println(s);
 }
public static void main(String[] args)
{
  Cat.print(1);
  Cat.print((byte)1);
  Cat.print("1");
  Cat.print(null);
 }
}

"এটা বলা কঠিন."

"প্রথম ক্ষেত্রে, 1 হল একটি int । আমাদের 100% মেথডের সাথে মিল আছে যেটি একটি int নেয়। প্রথম void প্রিন্ট(int n) বলা হবে।

দ্বিতীয় ক্ষেত্রে, আমাদের কাছে এমন কোনো পদ্ধতি নেই যা একটি বাইট নেয়। কিন্তু একটি ছোট এবং একটি int নিতে যে দুটি পদ্ধতি আছে. টাইপ প্রশস্তকরণের নিয়মের উপর ভিত্তি করে, একটি বাইটকে প্রথমে একটি সংক্ষিপ্ত আকারে প্রশস্ত করা হবে এবং তারপরে একটি int-এ প্রশস্ত করা হবে। এইভাবে, রায় হল যে অকার্যকর প্রিন্ট (সংক্ষিপ্ত এন)। বলা হবে।

তৃতীয় ক্ষেত্রে, আমাদের একটি 100% মিল রয়েছে যে পদ্ধতিটি একটি স্ট্রিং নেয় তার সাথে। অকার্যকর মুদ্রণ(স্ট্রিংগুলি)। পদ্ধতি বলা হবে।

চতুর্থ ঘটনাটি অস্পষ্ট। null একটি নির্দিষ্ট ধরনের নেই. কম্পাইলার এই কোড কম্পাইল করতে অস্বীকার করবে । এই ক্ষেত্রে, তৃতীয় পদ্ধতিকে কল করার জন্য আমাদের Cat.print((Integer)null) এবং চতুর্থটিকে কল করার জন্য Cat.print((স্ট্রিং)null) লিখতে হবে।"

"এটি খুব তথ্যপূর্ণ ছিল। আপনাকে ধন্যবাদ।"

"আমি উল্লেখ করতে চাই যে কল করার সঠিক পদ্ধতি নির্ধারণ করার সময়, প্রকারগুলি কেবল প্রশস্ত হতে পারে। তারা সংকীর্ণ করতে পারে না। এই উদাহরণটি বিবেচনা করুন:"

কোড
class Cat
{
 public static void print(short n)
 {
  System.out.println(n);
 }
 public static void print(Integer n)
 {
  System.out.println(n);
 }

 public static void main(String[] args)
 {
  Cat.print((byte)1);
  Cat.print(1);
 }
}

প্রথম ক্ষেত্রে, বাইট টাইপটি একটি সংক্ষিপ্ত আকারে প্রশস্ত করা হবে এবং প্রথম পদ্ধতিটিকে বলা হবে: void print(short n)। .

দ্বিতীয় ক্ষেত্রে, int থেকে Integer-এ একটি অন্তর্নিহিত প্রসারিত রূপান্তর হবে, এবং তারপর দ্বিতীয় পদ্ধতিটিকে বলা হবে: void print(Integer n)। .

"আমি এটা আশা করিনি।"

"না, এখানে আসল চমক:"

জাভা কোড বর্ণনা
class Cat
{
 public static void print(Object o)
 {
  System.out.println(o);
 }
 public static void print(String s)
 {
  System.out.println(s);
 }

 public static void main(String[] args)
 {
  Cat.print(1);
  Cat.print(null);
 }
}
প্রথম ক্ষেত্রে, int পূর্ণসংখ্যাতে প্রসারিত হবে। কারণ পূর্ণসংখ্যার জন্য কোন পদ্ধতি নেই, সবচেয়ে উপযুক্ত পদ্ধতি (এবং একটি বলা হয়) হল অকার্যকর প্রিন্ট (অবজেক্ট o)

দ্বিতীয় ক্ষেত্রে, কোন সংকলন ত্রুটি থাকবে না এবং অকার্যকর প্রিন্ট (স্ট্রিংগুলি) বলা হবে, যা কিছুটা স্পষ্ট নয়।

"অ্যামিগো, আমি আশা করি আপনি বুঝতে পেরেছেন যে এই ধরনের ক্ষেত্রে কোন পদ্ধতিটি বলা হবে তা জানার জন্য একটি টাইপ কাস্ট অপারেটর (যেমন আমরা «(বাইট)» দিয়ে করেছি) নির্দিষ্ট করা ভাল।"

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