CodeGym /جاوا بلاگ /Random-UR /بیس کلاس کنسٹرکٹرز
John Squirrels
سطح
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۔ مزید یہ کہ ہم واضح طور پر چائلڈ کلاس کنسٹرکٹر میں بیس کلاس کنسٹرکٹر کہہ سکتے ہیں۔ بیس کلاس کو " سپر کلاس " بھی کہا جاتا ہے۔ اسی لیے جاوا بیس کلاس کی نشاندہی کرنے کے لیے مطلوبہ لفظ super استعمال کرتا ہے۔ پچھلی مثال میں

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۔ یاد رکھیں ہم نے ذکر کیا ہے کہ جب کوئی چیز بنائی جاتی ہے تو پیرنٹ کلاس کنسٹرکٹر کو پہلے کہا جاتا ہے؟ اسی لیے super() ہمیشہ کنسٹرکٹر میں پہلے ہونا چاہیے! بصورت دیگر، کنسٹرکٹر منطق کی خلاف ورزی کی جائے گی اور پروگرام میں ایک خرابی پیدا ہوگی۔

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کلاسز میں ایک ایک جامد متغیر شامل کریں گے۔ کلاس میں animalCount متغیر زمین پر جانوروں کی کل تعداد کی نمائندگی کرے گا، اور catCount متغیر بلیوں کی انواع کی تعداد کو ظاہر کرے گا۔ مزید برآں، ہم دونوں کلاسوں میں تمام غیر جامد متغیرات کو ابتدائی قدریں تفویض کریں گے (جو پھر کنسٹرکٹر میں تبدیل ہو جائیں گی)۔ Animal

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جب کوئی آبجیکٹ بنتا ہے تو یہ وہی ظاہر ہوتا ہے : اینیمل بیس کلاس کنسٹرکٹر چل رہا ہے کیا اینیمل کلاس کے متغیرات پہلے ہی شروع ہو چکے ہیں؟ جامد متغیر جانوروں کی موجودہ قیمت شمار = 7700000 جانوروں کی کلاس میں دماغ کی موجودہ قیمت = جانوروں کی کلاس میں دماغ کی ابتدائی قدر جانوروں کی کلاس میں دل کی موجودہ قیمت = جانوروں کی کلاس میں دل کی ابتدائی قدر میں کیٹ کلاس کے متغیر پہلے سے موجود ہیں شروع کیا گیا ہے؟ جامد متغیر کی موجودہ قیمت catCount = 37 اینیمل بیس کلاس کنسٹرکٹر ہو گیا ہے! دماغ کی موجودہ قیمت = دماغ کی موجودہ قیمت دل = دل کی کیٹ کلاس کنسٹرکٹر شروع ہوچکا ہے (جانوروں کا کنسٹرکٹر پہلے ہی ختم ہوچکا ہے) جامد متغیر کی موجودہ قیمت catCount = 37 دم کی موجودہ قیمت = کیٹ کلاس میں دم کی ابتدائی قیمت tail کی موجودہ قیمت = Tail تو، اب ہم واضح طور پر ویری ایبل انیشیلائزیشن اور کنسٹرکٹر کالز کی ترتیب دیکھ سکتے ہیں جب کوئی نیا آبجیکٹ بنایا جاتا ہے:
  1. بیس کلاس ( Animal) کے جامد متغیرات کو شروع کیا جاتا ہے۔ ہمارے معاملے میں، Animalکلاس کا متغیر animalCount 7700000 پر سیٹ کیا گیا ہے۔

  2. چائلڈ کلاس ( Cat) کے جامد متغیرات کو شروع کیا جاتا ہے۔

    نوٹ: ہم ابھی بھی Animalکنسٹرکٹر کے اندر ہیں اور ہم پہلے ہی دکھا چکے ہیں:

    اینیمل بیس کلاس کنسٹرکٹر چل رہا ہے
    کیا اینیمل کلاس کے متغیر پہلے ہی شروع ہو چکے ہیں؟
    جامد متغیر جانوروں کی موجودہ قیمت شمار = 7700000
    جانوروں کی کلاس میں دماغ کی موجودہ قیمت = جانوروں کی کلاس میں دماغ کی ابتدائی قدر
    جانوروں کی کلاس میں دل کی موجودہ قیمت = جانوروں کی کلاس میں دل کی ابتدائی قدر میں کیٹ
    کلاس کے متغیر پہلے سے موجود ہیں شروع کیا گیا ہے؟
    جامد متغیر کی موجودہ قیمت catCount = 37


  3. پھر بیس کلاس کے غیر جامد متغیرات کو شروع کیا جاتا ہے۔ ہم نے انہیں خاص طور پر ابتدائی قدریں تفویض کیں، جنہیں پھر کنسٹرکٹر میں تبدیل کر دیا جاتا ہے۔ اینیمل کنسٹرکٹر ابھی ختم نہیں ہوا ہے، لیکن دماغ اور دل کی ابتدائی اقدار پہلے ہی تفویض کر دی گئی ہیں:

    اینیمل بیس کلاس کنسٹرکٹر چل رہا ہے
    کیا اینیمل کلاس کے متغیر پہلے ہی شروع ہو چکے ہیں؟
    جامد متغیر جانوروں کی موجودہ قیمت شمار = 7700000
    جانوروں کی کلاس میں دماغ کی موجودہ قیمت = جانوروں کی کلاس میں دماغ کی ابتدائی قدر
    جانوروں کی کلاس میں دل کی موجودہ قیمت = جانوروں کی کلاس میں دل کی ابتدائی قدر


  4. بیس کلاس کنسٹرکٹر شروع ہوتا ہے۔
    ہم پہلے ہی اپنے آپ کو قائل کر چکے ہیں کہ یہ مرحلہ چوتھا ہے: کنسٹرکٹر کے شروع میں پہلے تین مراحل میں Animal، بہت سے متغیرات کو پہلے ہی قدریں تفویض کر دی گئی ہیں۔


  5. چائلڈ کلاس ( Cat) کے غیر جامد فیلڈز کو شروع کیا جاتا ہے۔
    یہ Catکنسٹرکٹر کے چلنے سے پہلے ہوتا ہے۔
    جب یہ چلنا شروع ہوتا ہے، ٹیل متغیر کی پہلے سے ہی ایک قدر ہوتی ہے:

    کیٹ کلاس کنسٹرکٹر شروع ہو چکا ہے (دی اینیمل کنسٹرکٹر پہلے ہی ختم ہو چکا ہے) جامد متغیر کی موجودہ قیمت catCount = 37 دم کی موجودہ قیمت = کیٹ کلاس میں دم کی ابتدائی قدر


  6. Catچائلڈ کلاس کے کنسٹرکٹر کو کہا جاتا ہے۔

    اور جاوا میں آبجیکٹ بنانا ایسا ہی لگتا ہے!

    مجھے یہ کہنا ضروری ہے کہ ہم روٹ لرننگ کے بڑے پرستار نہیں ہیں، لیکن متغیر ابتدائی اور کنسٹرکٹر کالز کی ترتیب کو یاد رکھنا بہتر ہے ۔

    یہ پروگرام کے بہاؤ، اور کسی خاص لمحے میں آپ کی اشیاء کی حالت کے بارے میں آپ کی سمجھ میں بہت زیادہ اضافہ کرے گا۔

    مزید یہ کہ، بہت سی کلاسیں وراثت کا استعمال نہیں کرتی ہیں۔ اس صورت میں، بیس کلاس سے متعلق اقدامات لاگو نہیں ہوتے ہیں۔

تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION