CodeGym/Java Blog/এলোমেলো/বেস ক্লাস কনস্ট্রাক্টর
John Squirrels
লেভেল 41
San Francisco

বেস ক্লাস কনস্ট্রাক্টর

এলোমেলো দলে প্রকাশিত
সদস্যগণ
ওহে! গতবার আমরা কনস্ট্রাক্টর সম্পর্কে কথা বলেছিলাম এবং তাদের সম্পর্কে অনেক কিছু শিখেছি। এখন আমরা বেস ক্লাস কনস্ট্রাক্টর সম্পর্কে কথা বলতে যাচ্ছি ।
বেস ক্লাস কনস্ট্রাক্টর - 1
একটি বেস ক্লাস কি ? এটি জাভাতে বেশ কয়েকটি ভিন্ন শ্রেণীর একটি সাধারণ উত্স থাকতে পারে এই সত্যের সাথে সম্পর্কিত।
বেস ক্লাস কনস্ট্রাক্টর - 2
একে উত্তরাধিকার বলে । বেশ কয়েকটি শিশু শ্রেণীর একটি সাধারণ পূর্বপুরুষ থাকতে পারে। উদাহরণস্বরূপ, কল্পনা করুন যে আমাদের একটি Animalক্লাস আছে:
public class Animal {

   String name;
   int age;
}
আমরা 2টি চাইল্ড ক্লাস ঘোষণা করতে পারি: Catএবং Dog. এটি সম্প্রসারিত কীওয়ার্ড ব্যবহার করে করা হয় ।
public class Cat extends Animal {

}

public class Dog extends Animal {

}
আমরা ভবিষ্যতে এটি সহায়ক হতে পারে. উদাহরণস্বরূপ, যদি ইঁদুর ধরার কাজ থাকে তবে আমরা Cat আমাদের প্রোগ্রামে একটি বস্তু তৈরি করব। যদি কাজটি লাঠির পিছনে তাড়া করা হয়, তাহলে আমরা একটি Dog বস্তু ব্যবহার করব। এবং যদি আমরা এমন একটি প্রোগ্রাম তৈরি করি যা একটি ভেটেরিনারি ক্লিনিকের অনুকরণ করে, এটি ক্লাসের সাথে কাজ করবে Animal (এবং এইভাবে বিড়াল এবং কুকুর উভয়ের চিকিত্সা করতে সক্ষম হবে)। এটা মনে রাখা খুবই গুরুত্বপূর্ণ যে যখন একটি বস্তু তৈরি করা হয়, তখন তার বেস ক্লাসের কনস্ট্রাক্টরকে প্রথমে বলা হয় । কনস্ট্রাক্টর শেষ হলেই প্রোগ্রামটি আমাদের তৈরি করা অবজেক্টের সাথে সংশ্লিষ্ট ক্লাসের কনস্ট্রাক্টরকে এক্সিকিউট করে। অন্য কথায়, একটি Catঅবজেক্ট তৈরি করার সময়, কনস্ট্রাক্টরটি Animalপ্রথমে চালানো হয় , এবং শুধুমাত্র পরেCatকনস্ট্রাক্টর সম্পাদিত । এটি দেখতে, Catএবং Animalকনস্ট্রাক্টরগুলিতে কিছু কনসোল আউটপুট যোগ করুন।
public class Animal {

   public Animal() {
       System.out.println("Animal constructor executed");
   }
}


public class Cat extends Animal {

   public Cat() {
       System.out.println("Cat constructor executed!");
   }

   public static void main(String[] args) {
       Cat cat = new Cat();
   }
}
কনসোল আউটপুট: পশু কন্সট্রাক্টর মৃত্যুদন্ড কার্যকর করা হয়েছে ক্যাট কনস্ট্রাক্টর মৃত্যুদন্ড! প্রকৃতপক্ষে, এটা যে ভাবে কাজ করে! কেন? একটি কারণ হল দুটি শ্রেণীর মধ্যে ভাগ করা ক্ষেত্রগুলিকে নকল করা এড়ানো। উদাহরণস্বরূপ, প্রতিটি প্রাণীর একটি হৃদয় এবং মস্তিষ্ক আছে, কিন্তু প্রতিটি প্রাণীর একটি লেজ নেই। আমরা মস্তিষ্ক এবং হৃদপিণ্ডের ক্ষেত্র ঘোষণা করতে পারি, যা সমস্ত প্রাণীর জন্য অভিন্ন, Animalঅভিভাবক শ্রেণিতে এবং উপশ্রেণীতে একটি পুচ্ছCat ক্ষেত্র । . এখন আমরা একটি ক্লাস কনস্ট্রাক্টর ঘোষণা করব Catযা 3টি ক্ষেত্রের জন্য আর্গুমেন্ট নেয়।
public class Cat extends Animal {

   String tail;

   public Cat(String brain, String heart, String tail) {
       this.brain = brain;
       this.heart = heart;
       this.tail = tail;
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
দ্রষ্টব্য: কন্সট্রাক্টর সঠিকভাবে কাজ করে যদিও ক্লাসে Catমস্তিষ্ক এবং হৃদয়ের ক্ষেত্র নেই । এই ক্ষেত্রগুলি Animalবেস ক্লাস থেকে "উত্তরাধিকারসূত্রে প্রাপ্ত"। উত্তরাধিকারী ক্লাসের বেস ক্লাসের ক্ষেত্রগুলিতে অ্যাক্সেস রয়েছেCat , তাই সেগুলি আমাদের ক্লাসে দৃশ্যমান । ফলস্বরূপ, আমাদের ক্লাসে এই ক্ষেত্রগুলি নকল করার দরকার নেই Cat। আমরা তাদের ক্লাস থেকে নিতে পারি Animal। আরও কি, আমরা স্পষ্টভাবে চাইল্ড ক্লাস কনস্ট্রাক্টরে বেস ক্লাস কনস্ট্রাক্টর বলতে পারি। একটি বেস ক্লাসকে " সুপারক্লাস " ও বলা হয় । এজন্য জাভা বেস ক্লাস নির্দেশ করতে সুপার কীওয়ার্ড ব্যবহার করে। আগের উদাহরণে
public Cat(String brain, String heart, String tail) {
       this.brain = brain;
       this.heart = heart;
       this.tail = tail;
   }
আমরা আলাদাভাবে আমাদের অভিভাবক শ্রেণিতে প্রতিটি ক্ষেত্র বরাদ্দ করেছি। আমরা আসলে এটা করতে হবে না. প্যারেন্ট ক্লাস কনস্ট্রাক্টরকে কল করা এবং প্রয়োজনীয় আর্গুমেন্ট পাস করা যথেষ্ট:
public class Animal {

   String brain;
   String heart;

   public Animal(String brain, String heart) {
       this.brain = brain;
       this.heart = heart;
   }

public class Cat extends Animal {

   String tail;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       this.tail = tail;
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
কনস্ট্রাক্টরে Cat, আমরা Animalকনস্ট্রাক্টরকে ডেকেছি এবং দুটি ক্ষেত্র পাস করেছি। সুস্পষ্টভাবে আরম্ভ করার জন্য আমাদের কাছে শুধুমাত্র একটি ক্ষেত্র ছিল: tail , যা তে নেই Animal। মনে আছে আমরা উল্লেখ করেছি যে একটি বস্তু তৈরি করার সময় প্যারেন্ট ক্লাস কনস্ট্রাক্টরকে প্রথমে বলা হয়? তাই সুপার() সবসময় কনস্ট্রাক্টরে প্রথম হওয়া উচিত! অন্যথায়, কনস্ট্রাক্টর লজিক লঙ্ঘন করা হবে এবং প্রোগ্রামটি একটি ত্রুটি তৈরি করবে।
public class Cat extends Animal {

   String tail;

   public Cat(String brain, String heart, String tail) {
       this.tail = tail;
       super(brain, heart);// Error!
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
কম্পাইলার জানে যে যখন একটি চাইল্ড ক্লাসের একটি অবজেক্ট তৈরি করা হয়, তখন বেস ক্লাস কনস্ট্রাক্টরকে প্রথমে বলা হয়। এবং যদি আপনি ম্যানুয়ালি এই আচরণ পরিবর্তন করার চেষ্টা করেন, কম্পাইলার এটি অনুমতি দেবে না।

কিভাবে একটি বস্তু তৈরি হয়

আমরা পূর্বে একটি বেস এবং প্যারেন্ট ক্লাস সহ একটি উদাহরণ দেখেছি: Animalএবং Cat। উদাহরণ হিসাবে এই দুটি ক্লাস ব্যবহার করে, আমরা এখন একটি বস্তু তৈরি এবং ভেরিয়েবল শুরু করার প্রক্রিয়াটি দেখব। আমরা জানি যে স্ট্যাটিক এবং ইনস্ট্যান্স (নন-স্ট্যাটিক) ভেরিয়েবল আছে । আমরা আরও জানি যে Animalবেস ক্লাসের ভেরিয়েবল আছে, এবং Catচাইল্ড ক্লাসের নিজস্ব আছে। স্পষ্টতার জন্য, আমরা প্রতিটি Animalএবং Catক্লাসে একটি স্ট্যাটিক ভেরিয়েবল যোগ করব। ক্লাসে অ্যানিমেল কাউন্ট ভেরিয়েবল Animalপৃথিবীতে মোট প্রাণী প্রজাতির সংখ্যা এবং catCount প্রতিনিধিত্ব করবেপরিবর্তনশীল বিড়াল প্রজাতির সংখ্যা নির্দেশ করবে। উপরন্তু, আমরা উভয় শ্রেণীতে সমস্ত অ-স্ট্যাটিক ভেরিয়েবলের জন্য প্রারম্ভিক মান নির্ধারণ করব (যা তারপর কনস্ট্রাক্টরে পরিবর্তন করা হবে)।
public class Animal {

   String brain = "Initial value of brain in the Animal class";
   String heart = "Initial value of heart in the Animal class";

   public static int animalCount = 7700000;

   public Animal(String brain, String heart) {
       System.out.println("Animal base class constructor is running");
       System.out.println("Have the variables of the Animal class already been initialized?");
       System.out.println("Current value of static variable animalCount = " + animalCount);
       System.out.println("Current value of brain in the Animal class = " + this.brain);
       System.out.println("Current value of heart in the Animal class = " + this.heart);
       System.out.println("Have the variables of the Cat class already been initialized?");
       System.out.println("Current value of static variable catCount = " + Cat.catCount);

       this.brain = brain;
       this.heart = heart;
       System.out.println("Animal base class constructor is done!");
       System.out.println("Current value of brain = " + this.brain);
       System.out.println("Current value of heart = " + this.heart);
   }
}

public class Cat extends Animal {

   String tail = "Initial value of tail in the Cat class";

   static int catCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println("The cat class constructor has started (The Animal constructor already finished)");
       System.out.println("Current value of static variable catCount = " + catCount);
       System.out.println("Current value of tail = " + this.tail);
       this.tail = tail;
       System.out.println("Current value of tail = " + this.tail);
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
সুতরাং আমরা ক্লাসের একটি নতুন উদাহরণ তৈরি করছি Cat, যা উত্তরাধিকারসূত্রে পাওয়া যায় Animal। কি ঘটছে এবং কোন ক্রমে দেখতে আমরা কিছু বিস্তারিত কনসোল আউটপুট যোগ করেছি। Catযখন একটি বস্তু তৈরি করা হয় তখন এটি প্রদর্শিত হবে :অ্যানিম্যাল বেস ক্লাস কনস্ট্রাক্টর চলছে স্ট্যাটিক ভেরিয়েবলের বর্তমান মান animalCount = 7700000 প্রাণীর শ্রেণীতে মস্তিষ্কের বর্তমান মান = পশু শ্রেণীতে মস্তিষ্কের প্রারম্ভিক মান পশু শ্রেণীতে হৃদয়ের বর্তমান মান = পশু শ্রেণীতে হৃদয়ের প্রাথমিক মান ইতিমধ্যেই বিড়াল শ্রেণীর ভেরিয়েবল আছে আরম্ভ করা হয়েছে? স্ট্যাটিক ভেরিয়েবলের বর্তমান মান catCount = 37 Animal base class constructor হয়ে গেছে! মস্তিষ্কের বর্তমান মান = মস্তিষ্কের বর্তমান মান হৃদয় = হৃদয় বিড়ালের শ্রেণী নির্মাণকারী শুরু হয়েছে (প্রাণী নির্মাণকারী ইতিমধ্যেই শেষ হয়েছে) স্ট্যাটিক ভেরিয়েবলের বর্তমান মান catCount = 37 পুচ্ছের বর্তমান মান = বিড়াল শ্রেণিতে লেজের প্রাথমিক মান = লেজের বর্তমান মান লেজ সুতরাং, এখন আমরা একটি নতুন অবজেক্ট তৈরি করার সময় পরিবর্তনশীল ইনিশিয়ালাইজেশন এবং কনস্ট্রাক্টর কলের ক্রম পরিষ্কারভাবে দেখতে পাচ্ছি:
  1. বেস ক্লাস ( ) এর স্ট্যাটিক ভেরিয়েবল Animalশুরু করা হয়। আমাদের ক্ষেত্রে, Animalক্লাসের পরিবর্তনশীল animalCount 7700000 এ সেট করা হয়েছে।

  2. চাইল্ড ক্লাসের স্ট্যাটিক ভেরিয়েবল ( Cat) শুরু করা হয়।

    দ্রষ্টব্য: আমরা এখনও Animalকনস্ট্রাক্টরের ভিতরে আছি এবং আমরা ইতিমধ্যেই প্রদর্শন করেছি:

    অ্যানিম্যাল বেস ক্লাস কনস্ট্রাক্টর
    চলছে
    স্ট্যাটিক ভেরিয়েবলের বর্তমান মান animalCount = 7700000
    প্রাণীর শ্রেণীতে মস্তিষ্কের বর্তমান মান = পশু শ্রেণীতে মস্তিষ্কের প্রারম্ভিক মান পশু শ্রেণীতে
    হৃদয়ের বর্তমান মান = পশু শ্রেণীতে হৃদয়ের প্রাথমিক মান
    ইতিমধ্যেই বিড়াল শ্রেণীর ভেরিয়েবল আছে আরম্ভ করা হয়েছে?
    স্ট্যাটিক ভেরিয়েবলের বর্তমান মান catCount = 37


  3. তারপর বেস ক্লাসের নন-স্ট্যাটিক ভেরিয়েবল শুরু করা হয়। আমরা বিশেষভাবে তাদের প্রাথমিক মান বরাদ্দ করেছি, যা পরে কনস্ট্রাক্টরে প্রতিস্থাপিত হয়। প্রাণী কনস্ট্রাক্টর এখনও শেষ হয়নি, তবে মস্তিষ্ক এবং হৃদয়ের প্রাথমিক মানগুলি ইতিমধ্যেই বরাদ্দ করা হয়েছে:


    অ্যানিমেল বেস ক্লাস কনস্ট্রাক্টর চলছে
    স্থির পরিবর্তনশীল পশুর বর্তমান মান = 7700000
    প্রাণী শ্রেণিতে মস্তিষ্কের বর্তমান মান = প্রাণী শ্রেণিতে মস্তিষ্কের প্রাথমিক মান পশু
    শ্রেণিতে হৃদয়ের বর্তমান মান = পশু শ্রেণিতে হৃদয়ের প্রাথমিক মান


  4. বেস ক্লাস কনস্ট্রাক্টর শুরু হয়।
    আমরা ইতিমধ্যেই নিজেদেরকে নিশ্চিত করেছি যে এই ধাপটি চতুর্থ: কন্সট্রাক্টরের শুরুতে প্রথম তিনটি ধাপে Animal, অনেক ভেরিয়েবল ইতিমধ্যেই মান নির্ধারণ করা হয়েছে।


  5. চাইল্ড ক্লাস ( ) এর নন-স্ট্যাটিক ক্ষেত্রগুলি Catআরম্ভ করা হয়েছে। কনস্ট্রাক্টর চালু হওয়ার
    আগে এটি ঘটে । যখন এটি চলতে শুরু করে, টেল ভেরিয়েবলের ইতিমধ্যে একটি মান থাকে:Cat

    ক্যাট ক্লাস কনস্ট্রাক্টর শুরু হয়েছে (দ্য অ্যানিমাল কনস্ট্রাক্টর ইতিমধ্যেই শেষ হয়েছে) স্ট্যাটিক ভেরিয়েবলের বর্তমান মান catCount = 37 লেজের বর্তমান মান = ক্যাট ক্লাসে লেজের প্রাথমিক মান


  6. শিশু শ্রেণীর নির্মাতাকে Catবলা হয়

    এবং এটিই জাভাতে একটি বস্তু তৈরি করা দেখতে কেমন লাগে!

    আমি অবশ্যই বলব যে আমরা রোট-লার্নিং এর বড় অনুরাগী নই, তবে পরিবর্তনশীল ইনিশিয়ালাইজেশন এবং কনস্ট্রাক্টর কলের ক্রম মনে রাখা ভাল

    এটি প্রোগ্রামের প্রবাহ এবং যেকোনো নির্দিষ্ট মুহূর্তে আপনার বস্তুর অবস্থা সম্পর্কে আপনার বোঝার ব্যাপকভাবে বৃদ্ধি করবে।

    অধিকন্তু, অনেক শ্রেণী উত্তরাধিকার ব্যবহার করে না। এই ক্ষেত্রে, বেস ক্লাস সম্পর্কিত পদক্ষেপগুলি প্রযোজ্য নয়।

মন্তব্য
  • জনপ্রিয়
  • নতুন
  • পুরানো
মন্তব্য লেখার জন্য তোমাকে অবশ্যই সাইন ইন করতে হবে
এই পাতায় এখনও কোনো মন্তব্য নেই