1. সমস্ত শ্রেণীর উত্তরাধিকারObject

জাভাতে সমস্ত ক্লাস অন্তর্নিহিতভাবে Objectক্লাসের উত্তরাধিকারী।

আমরা জাভা কোর অনুসন্ধানে উত্তরাধিকার কী এবং এটি জাভাতে কীভাবে কাজ করে তা বিশ্লেষণ করব। আপাতত, আমরা একটি সাধারণ তথ্য বিবেচনা করব যা এটি থেকে অনুসরণ করে:

যেকোন শ্রেণীর একটি অবজেক্ট একটি Objectভেরিয়েবলের সাথে বরাদ্দ করা যেতে পারে। উদাহরণ:

কোড বিঃদ্রঃ
Object o = new Scanner(System.in);
ভেরিয়েবল একটি বস্তুর oএকটি রেফারেন্স সংরক্ষণ করেScanner
Object o = new String();
ভেরিয়েবল একটি বস্তুর oএকটি রেফারেন্স সংরক্ষণ করেString
Object o = new Integer(15);
ভেরিয়েবল একটি বস্তুর oএকটি রেফারেন্স সংরক্ষণ করেInteger
Object o = "Hello";
ভেরিয়েবল একটি বস্তুর oএকটি রেফারেন্স সংরক্ষণ করেString

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

আপনি যদি বস্তুর মূল প্রকারের সাথে যুক্ত পদ্ধতিগুলিকে কল করতে চান, তাহলে আপনাকে প্রথমে সঠিক প্রকারের একটি ভেরিয়েবলে এটির একটি রেফারেন্স সংরক্ষণ করতে হবে এবং তারপর সেই ভেরিয়েবলের পদ্ধতিগুলিকে কল করতে হবে:

কোড বিঃদ্রঃ
Object o = new Scanner(System.in);
int x = o.nextInt();
প্রোগ্রাম কম্পাইল হবে না. ক্লাসের কোন পদ্ধতি Objectনেই ।nextInt()
Object o = new Scanner(System.in);

Scanner console = (Scanner) o;

int x = console.nextInt();
এই কাজ হবে.

এখানে আমরা একটি টাইপকাস্ট অপারেটরScanner ব্যবহার করে একটি ভেরিয়েবলের একটি বস্তুর একটি রেফারেন্স সংরক্ষণ করি । Scanner

Objectআপনি শুধু যেতে পারবেন না এবং একটি স্ক্যানার ভেরিয়েবলে একটি ভেরিয়েবল বরাদ্দ করতে পারবেন না , এমনকি যদি ভেরিয়েবলটি একটি বস্তুর Objectরেফারেন্স সঞ্চয় করে । Scannerকিন্তু আপনি যদি টাইপকাস্ট অপারেটর ব্যবহার করেন তবে আপনি এটি করতে পারেন , যার সম্পর্কে আপনি ইতিমধ্যেই জানেন। এটি তার সাধারণ চেহারা:

Type name1 = (Type) name2;

যেখানে name1একটি ভেরিয়েবলের নাম Typeএবং name2এটি একটি ভেরিয়েবলের নাম যা একটি বস্তুর Objectএকটি রেফারেন্স সংরক্ষণ করে ।Type

টাইপকাস্টিং

ভেরিয়েবলের টাইপ এবং অবজেক্টের টাইপ মিল না হলে, a ClassCastExceptionনিক্ষেপ করা হবে। উদাহরণ:

কোড বিঃদ্রঃ
Object o = new Integer(5);
String s = (String) o;
রানটাইমে একটি ত্রুটি ঘটবে:
একটি ClassCastExceptionএখানে নিক্ষেপ করা হবে

জাভাতে এই ত্রুটিটি এড়ানোর একটি উপায় রয়েছে: আমরা একটি ভেরিয়েবলের মধ্যে সংরক্ষিত বস্তুর ধরন পরীক্ষা করে এটি করি :

name instanceof Type

অপারেটর instanceofপরীক্ষা করে যে nameভেরিয়েবলটি একটি Typeঅবজেক্ট কিনা।

একটি উদাহরণ হিসাবে, আসুন বিভিন্ন বস্তুর অ্যারের মধ্যে একটি স্ট্রিং খুঁজে পাই:

কোড বিঃদ্রঃ
Object[] objects = {10, "Hello", 3.14};

for (int i = 0; i < objects.length; i++)
{
   if (objects[i] instanceof String)
   {
      String s = (String) objects[i];
      System.out.println(s);
   }
}
অটোবক্সিং এই মানগুলিকে যথাক্রমে একটি Integer, String, এবং তে রূপান্তর করবে ৷ অবজেক্টের অ্যারে লুপ করুন যদি অবজেক্টটি একটি ভেরিয়েবলে সংরক্ষণ করুন স্ক্রিনে ভেরিয়েবলটি প্রদর্শন করুন। Double



String

String


2. জেনেরিক কেন হাজির হয়েছিল — সংগ্রহ

আসুন সংগ্রহে ফিরে যাই।

জাভা বিকাশকারীরা ক্লাস তৈরি করার সাথে সাথেই ArrayListতারা এটিকে সর্বজনীন করতে চেয়েছিল, যাতে এটি যে কোনও ধরণের বস্তু সংরক্ষণ করতে পারে। তাই তারা Objectউপাদান সংরক্ষণ করার জন্য s এর একটি অ্যারে ব্যবহার করেছে।

এই পদ্ধতির শক্তি হল যে আপনি সংগ্রহে যেকোনো ধরনের বস্তু যোগ করতে পারেন।

অবশ্যই, বেশ কিছু দুর্বলতা আছে।

অসুবিধা 1.

একটি সংগ্রহ থেকে উপাদান পুনরুদ্ধার করার সময় সর্বদা একটি টাইপ রূপান্তর অপারেটর লেখার প্রয়োজন ছিল:

কোড বিঃদ্রঃ
ArrayList numbers = new ArrayList();


for (int i = 0; i < 10; i++)
   numbers.add(i * 10);


int sum = 0;
for (int i = 0; i < 10; i++)
{
   sum = sum + (Integer) numbers.get(i);
}
Objectবস্তুর রেফারেন্স সংরক্ষণ করার জন্য একটি সংগ্রহ তৈরি করুন

সংখ্যা দিয়ে সংগ্রহটি পূরণ করুন 10, 20, ... 100;



সংগ্রহের উপাদানগুলির যোগফল


টাইপকাস্টিং প্রয়োজনীয়

অসুবিধা 2.

কোন গ্যারান্টি ছিল না যে একটি সংগ্রহে একটি নির্দিষ্ট ধরনের উপাদান রয়েছে

কোড বিঃদ্রঃ
ArrayList numbers = new ArrayList();


for (int i = 0; i < 10; i++)
   numbers.add(i * 2.5);


int sum = 0;
for (int i = 0; i < 10; i++)
{
   sum = sum + (Integer) numbers.get(i);
}
Objectবস্তুর রেফারেন্স সংরক্ষণ করার জন্য একটি সংগ্রহ তৈরি করুন

আমরা বস্তু হিসাবে উপস্থাপিত সংখ্যাগুলি দিয়ে সংগ্রহটি পূরণ করি Double:
0.0, 2.5, 5.0, ...


সংগ্রহের উপাদানগুলির যোগফল


একটি ত্রুটি থাকবে: একটি Doubleএকটিতে কাস্ট করা যাবে নাInteger

ডেটা যে কোনও জায়গায় সংগ্রহে রাখা যেতে পারে:

  • অন্য পদ্ধতিতে
  • অন্য প্রোগ্রামে
  • একটি ফাইল থেকে
  • নেটওয়ার্কের উপর

অসুবিধা 3.

সংগ্রহে থাকা ডেটা দুর্ঘটনাক্রমে পরিবর্তন করা যেতে পারে।

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

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


3. জেনেরিক

জাভাতে জেনেরিক

জাভাতে, জেনেরিক নামক এই দুর্দান্ত জিনিসটি দ্বারা এই সমস্ত সমস্যাগুলি দূর করা হয়।

জাভাতে, জেনেরিক মানে টাইপের সাথে টাইপ প্যারামিটার যোগ করার ক্ষমতা। ফলাফল একটি জটিল যৌগিক প্রকার। এই ধরনের একটি যৌগিক ধরনের সাধারণ দৃষ্টিভঙ্গি হল:

ClassName<TypeParameter>

এটি একটি জেনেরিক ক্লাস। এবং আপনি যেখানে সাধারণত ক্লাস ব্যবহার করেন সেখানে এটি ব্যবহার করা যেতে পারে।

কোড বর্ণনা
ArrayList<Integer> list;
ভেরিয়েবল তৈরি করা
list = new ArrayList<Integer> ();
বস্তু তৈরি করা
ArrayList<Integer>[] array;
অ্যারে তৈরি করা হচ্ছে

Integerএই ধরনের সংগ্রহে শুধুমাত্র ভেরিয়েবল সংরক্ষণ করা যেতে পারে:

কোড বর্ণনা
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(new Integer(1));
list.add(2);
list.add("Hello");
ArrayListIntegerউপাদান সহ সংগ্রহ
এটি অনুমোদিত
এবং এটিও কাজ করবে
অটোবক্সিং

কিন্তু এটি অনুমোদিত নয়: সংকলন ত্রুটি

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


4. জেনেরিক কিভাবে কাজ করে

আসলে, জেনেরিকগুলি ভয়ঙ্কর আদিম।

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

কোড কম্পাইলার কি করে
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList list = new ArrayList();
list.add(1);
list.add( (Integer) 1 );
int x = list.get(0);
int x = (Integer) list.get(0);
list.set(0, 10);
list.set(0, (Integer) 10);

ধরুন আমাদের একটি পদ্ধতি আছে যা পূর্ণসংখ্যার একটি সংগ্রহে সংখ্যা যোগ করে:

কোড কম্পাইলার কি করে
public int sum(ArrayList<Integer> numbers)
{
   int result = 0;

   for (int i = 0; i < numbers.size(); i++)
      result = result + numbers.get(i);

   return result;
}
public int sum(ArrayList numbers)
{
   int result = 0;

   for (int i = 0; i < numbers.size(); i++)
      result = result + (Integer) numbers.get(i);

   return result;
}

অন্য কথায়, জেনেরিক হ'ল এক ধরণের সিনট্যাকটিক চিনি, ঠিক অটোবক্সিংয়ের মতো, তবে আরও কিছুটা। অটোবক্সিংয়ের সাথে, কম্পাইলার একটিকে intএকটি Integerএবং তদ্বিপরীত রূপান্তর করার পদ্ধতি যোগ করে এবং জেনেরিকের জন্য এটি টাইপকাস্ট অপারেটর যোগ করে।

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

কখনও কখনও প্রোগ্রামাররা জেনেরিক ক্লাস (টাইপ প্যারামিটার সহ ক্লাস) লিখতে আসলে আর্গুমেন্ট হিসাবে পাস করা প্রকারগুলি সম্পর্কে তথ্যের প্রয়োজন হয়। জাভা কালেকশন কোয়েস্টে, আপনি শিখবেন কিভাবে এর সাথে মোকাবিলা করতে হয় এবং এর সাথে কী জড়িত।



5. জেনেরিক সম্পর্কে কিছু তথ্য

জেনেরিক সম্পর্কে আরও কিছু আকর্ষণীয় তথ্য এখানে রয়েছে।

ক্লাসের বিভিন্ন ধরনের প্যারামিটার থাকতে পারে। এটা এই মত কিছু দেখায়:

ClassName<TypeParameter1, TypeParameter2, TypeParameter3>

আসলে, এটা সত্যিই আশ্চর্যজনক নয়। যেকোন জায়গায় কম্পাইলার একটি অপারেটরকে এক ধরনের কাস্ট করতে যোগ করতে পারে, এটি একাধিক টাইপকাস্ট অপারেটর যোগ করতে পারে।

উদাহরণ:

কোড বিঃদ্রঃ
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put(7, "Hello");
map.put(-15, "Hello");
পদ্ধতির putপ্রথম প্যারামিটার হল একটি Integer, এবং দ্বিতীয়টি হল a৷String

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

ClassName<TypeParameter<TypeParameterParameter>>

ধরুন আমরা একটি তালিকা তৈরি করতে চাই যা স্ট্রিংগুলির তালিকা সংরক্ষণ করবে। এই ক্ষেত্রে, আমরা এই মত কিছু পেতে হবে:

// List of greetings
ArrayList<String> listHello = new ArrayList<String>();
listHello.add ("Hello");
listHello.add ("Hi");

// List of goodbyes
ArrayList<String> listBye = new ArrayList<String>();
listBye.add("Bye");
listBye.add ("Goodbye");

// List of lists
ArrayList<ArrayList<String>> lists = new ArrayList<ArrayList<String>>();
lists.add(listHello);
lists.add(listBye);

জেনেরিক প্রকারগুলি (টাইপ পরামিতি সহ প্রকারগুলি) অ্যারে প্রকার হিসাবেও ব্যবহার করা যেতে পারে। এটা এই মত কিছু দেখায়:

ClassName<TypeParameter>[] array = new ClassName<TypeParameter>[size];

এখানে যাদুকর কিছুই ঘটছে না: কোণ বন্ধনীগুলি কেবল প্রকারের নাম নির্দেশ করে:

কোড নন-জেনারিক কাউন্টারপার্ট
ArrayList<String>[] list = new ArrayList<String>[10];
StringArrayList[] list = new StringArrayList[10];
ArrayList<Integer>[] list = new ArrayList<Integer>[10];
IntegerArrayList[] list = new IntegerArrayList[10];
ArrayList<Scanner>[] list = new ArrayList<Scanner>[10];
ScannerArrayList[] list = new ScannerArrayList[10];