JavaRush /جاوا بلاگ /Random-UR /بیس کلاس کنسٹرکٹرز

بیس کلاس کنسٹرکٹرز

گروپ میں شائع ہوا۔
ہیلو! پچھلی بار ہم نے کنسٹرکٹرز کے بارے میں بات کی ، اور ہم نے ان کے بارے میں بہت کچھ سیکھا۔ اب ہم بیس کلاس کنسٹرکٹرز جیسی چیز کے بارے میں بات کریں گے۔ بیس کلاس کیا ہے ؟ حقیقت یہ ہے کہ جاوا میں، کئی مختلف کلاسوں کی ایک مشترکہ اصل ہو سکتی ہے۔ بیس کلاس کنسٹرکٹرز - 2اسے وراثت کہتے ہیں ۔ کئی نسلی طبقوں میں ایک مشترکہ آباؤ اجداد کی کلاس ہو سکتی ہے۔ مثال کے طور پر، تصور کریں کہ ہمارے پاس ایک کلاس Animal(جانور):
public class Animal {

   String name;
   int age;
}
ہم اس کے لیے بنا سکتے ہیں، مثال کے طور پر، 2 نسلی طبقے - Catاور Dog. یہ کلیدی لفظ کا استعمال کرتے ہوئے کیا جاتا ہے extends۔
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 completed");
   }
}


public class Cat extends Animal {

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

   public static void main(String[] args) {
       Cat cat = new Cat();
   }
}
کنسول آؤٹ پٹ:

Отработал конструктор Animal
Отработал конструктор Cat!
درحقیقت، اس طرح یہ سب کام کرتا ہے! یہ کس لیے ہے؟ مثال کے طور پر، دو کلاسوں کے مشترکہ فیلڈز کو نقل کرنے سے بچنے کے لیے۔ مثال کے طور پر، ہر جانور کا دل اور دماغ ہوتا ہے، لیکن ہر جانور کی دم نہیں ہوتی۔ ہم پیرنٹ کلاس brainمیں فیلڈز کو تمام جانوروں کے لیے مشترک قرار دے سکتے ہیں اور ذیلی کلاس میں ایک فیلڈ کا اعلان کر سکتے ہیں ۔ اب ہم کلاس کے لیے ایک کنسٹرکٹر بنائیں گے ، جہاں ہم تمام 3 فیلڈز کو پاس کریں گے۔ heartAnimaltailCatCat
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فیلڈز نہیں ہیں brainاور heart. ان فیلڈز کو بیس کلاس سے "پُل اپ" کیا گیا تھا Animal۔ نسلی طبقے کو بیس کلاس کے شعبوں تک رسائی حاصل ہے، اس لیے Catوہ ہماری کلاس میں نظر آتے ہیں۔ لہذا، ہمیں کلاس میں ان فیلڈز کو ڈپلیکیٹ کرنے کی ضرورت نہیں ہے Cat- ہم انہیں کلاس سے لے سکتے ہیں Animal۔ مزید یہ کہ ہم واضح طور پر بیس کلاس کے کنسٹرکٹر کو ڈیسنڈنٹ کلاس کے کنسٹرکٹر میں کہہ سکتے ہیں۔ بیس کلاس کو " سپر کلاس " بھی کہا جاتا ہے، یہی وجہ ہے کہ Java کلیدی لفظ استعمال کرتا ہے 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کلاس متغیر Animalزمین پر جانوروں کی انواع کی کل تعداد ہو گی، اور متغیر catsCountبلیوں کی انواع کی تعداد ہو گی۔ اس کے علاوہ، ہم دونوں کلاسوں کے تمام غیر جامد متغیرات کو ابتدائی قدریں تفویض کریں گے (جو پھر کنسٹرکٹر میں تبدیل ہو جائیں گی)۔
public class Animal {

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

   public static int animalCount = 7700000;

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

       this.brain = brain;
       this.heart = heart;
       System.out.println("Animal base class constructor completed!");
       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 = "The initial value of tail in the Cat class";

   static int catsCount = 37;

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

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
لہذا، ہم کلاس کا ایک نیا آبجیکٹ بناتے ہیں Catجو وراثت میں ملتا ہے Animal۔ آئیے اپنے پروگرام میں تفصیلی کنسول آؤٹ پٹ شامل کرتے ہیں تاکہ دیکھیں کہ کیا ہوگا اور کس ترتیب میں۔ آبجیکٹ بنانے کے نتیجے میں کنسول میں آؤٹ پٹ یہی ہوگا Cat:

Выполняется конструктор базового класса Animal
Были ли уже проинициализированы переменные класса Animal?
Текущее meaning статической переменной animalCount = 7700000
Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
Были ли уже проинициализированы переменные класса Cat?
Текущее meaning статической переменной catsCount = 37
Конструктор базового класса Animal завершил работу!
Текущее meaning brain = Мозг
Текущее meaning heart = Сердце
Конструктор класса Cat начал работу (конструктор Animal уже был выполнен)
Текущее meaning статической переменной catsCount = 37
Текущее meaning tail = Изначальное meaning tail в классе Cat
Текущее meaning tail = Хвост
لہذا، اب ہم واضح طور پر دیکھ سکتے ہیں کہ متغیرات کو کس ترتیب سے شروع کیا جاتا ہے اور ایک نیا آبجیکٹ بناتے وقت کنسٹرکٹرز کو بلایا جاتا ہے:
  1. بیس کلاس ( ) کے جامد متغیرات کو شروع کیا جاتا ہے ۔ ہمارے معاملے میں، کلاس متغیر کی قدر 7700000 تفویض کی گئی ہے۔AnimalanimalCountAnimal

  2. ڈیسنڈنٹ کلاس ( ) کے جامد متغیرات کو شروع کیا گیا ہے ۔ توجہ دیں - ہم ابھی بھی کنسٹرکٹر کے اندر ہیں ، اور کنسول پہلے ہی کہتا ہے:CatAnimal

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
        Были ли уже проинициализированы переменные класса Cat?
        Текущее meaning статической переменной catsCount = 37
  3. اگلا، بیس کلاس کے غیر جامد متغیرات کو شروع کیا جاتا ہے ۔ ہم نے انہیں خاص طور پر ابتدائی قدریں تفویض کیں، جنہیں پھر کنسٹرکٹر میں تبدیل کر دیا جاتا ہے۔ کنسٹرکٹر نے ابھی تک اپنا کام مکمل نہیں کیا ہے، لیکن ابتدائی اقدار پہلے ہی تفویض کر دی گئی ہیں :Animalbrainheart

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
  4. بیس کلاس کنسٹرکٹر کام کرنا شروع کرتا ہے ۔

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

  5. چائلڈ کلاس کے غیر جامد فیلڈز کا آغاز کرنا ( )Cat

    یہ ڈیزائنر کے Catکام شروع کرنے سے پہلے ہوتا ہے۔

    جس وقت اس نے کام کرنا شروع کیا، متغیر کی tailپہلے سے ہی ایک قدر تھی:

    
    Конструктор класса Cat начал работу (конструктор Animal уже был выполнен)
    Текущее meaning статической переменной catsCount = 37
    Текущее meaning tail = Изначальное meaning tail в классе Cat
  6. نسلی طبقے کے کنسٹرکٹر کو کہا جاتا ہے۔ Cat

جاوا میں آبجیکٹ بنانے کا عمل ایسا لگتا ہے! مجھے یہ کہنا ضروری ہے کہ ہم کریمنگ کے بڑے پرستار نہیں ہیں، لیکن یہ بہتر ہے کہ متغیرات کو شروع کرنے اور کنسٹرکٹرز کو کال کرنے اور انہیں مستقبل کے لیے یاد رکھنے کے آرڈر کو یاد رکھیں ۔ یہ کسی بھی لمحے پروگرام کی پیشرفت اور آپ کی اشیاء کی حالت کے بارے میں آپ کی سمجھ میں بہت زیادہ اضافہ کرے گا۔ مزید یہ کہ، کلاسوں میں اکثر براہ راست والدین کی کلاسیں نہیں ہوتی ہیں (سپر کلاسز/بیس کلاسز)۔ اس صورت میں، بیس کلاس سے وابستہ آئٹمز پر عمل نہیں کیا جائے گا۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION