CodeGym /جاوا بلاگ /Random-UR /آبجیکٹ کی تخلیق کے دوران اعمال کی ترتیب
John Squirrels
سطح
San Francisco

آبجیکٹ کی تخلیق کے دوران اعمال کی ترتیب

گروپ میں شائع ہوا۔
ہائے! آج کا سبق کافی... اہ... کثیر جہتی ہو گا :) اس لحاظ سے کہ ہم موضوعات کی ایک وسیع رینج کا احاطہ کریں گے، لیکن ان سب کا تعلق آبجیکٹ بنانے کے عمل سے ہوگا ۔ آبجیکٹ کی تخلیق کے دوران اعمال کی ترتیب - 1ہم شروع سے آخر تک اس کا تجزیہ کریں گے: کنسٹرکٹرز کو کس طرح بلایا جاتا ہے، کس طرح اور کس ترتیب سے فیلڈز (بشمول جامد فیلڈز) شروع کیے جاتے ہیں، وغیرہ۔ ہم نے پہلے مضمون میں زیر بحث کچھ نکات کو چھوا ہے، تاکہ آپ ان پر ایک نظر ڈال سکیں۔ بیس کلاس کنسٹرکٹرز پر مواد سب سے پہلے، آئیے یاد کرتے ہیں کہ ایک چیز کیسے بنتی ہے۔ آپ کو اچھی طرح یاد ہے کہ یہ عمل ڈویلپر کے نقطہ نظر سے کیسا لگتا ہے: وہ ایک کلاس بناتا ہے، لکھتا ہے new، اور سب کچھ تیار ہے :) یہاں ہم بات کریں گے کہ کمپیوٹر اور جاوا مشین کے اندر کیا ہوتا ہے جب ہم لکھتے ہیں، مثال کے طور پر:
Cat cat = new Cat();
ہم اس کے بارے میں پہلے بھی بات کر چکے ہیں، لیکن صرف اس صورت میں جب ہم آپ کو یاد دلائیں گے:
  • سب سے پہلے، آبجیکٹ کو ذخیرہ کرنے کے لیے میموری مختص کی جاتی ہے۔
  • اگلا، جاوا مشین آبجیکٹ کا حوالہ بناتی ہے (ہمارے معاملے میں حوالہ کیٹ بلی ہے)۔
  • آخر میں، متغیرات کو شروع کیا جاتا ہے اور کنسٹرکٹر کو کہا جاتا ہے (ہم اس عمل کو مزید تفصیل سے دیکھیں گے)۔
اس کے علاوہ، آبجیکٹ لائف سائیکل کے سبق سے ، آپ کو شاید یاد ہوگا کہ کوئی چیز اس وقت تک قائم رہتی ہے جب تک اس کا کم از کم ایک حوالہ موجود ہو۔ اگر کوئی باقی نہ رہے تو وہ چیز کچرا اٹھانے والے کا شکار بن جاتی ہے۔ آبجیکٹ کی تخلیق کے دوران اعمال کی ترتیب - 2ان پہلے دو نکات کو کوئی خاص سوال نہیں اٹھانا چاہیے۔ میموری مختص کرنا ایک سادہ عمل ہے، اور اس کے صرف دو ہی ممکنہ نتائج ہیں: یا تو میموری ہے یا نہیں ہے :) اور لنک بنانا کوئی غیر معمولی بات نہیں ہے۔ لیکن تیسرا نکتہ سخت ترتیب میں انجام پانے والے آپریشنز کے پورے سیٹ کی نمائندگی کرتا ہے۔ میں ٹیسٹوں کے لیے کریمنگ کا پرستار نہیں ہوں، لیکن آپ کو اس عمل کو اچھی طرح سے سمجھنے کی ضرورت ہے اور آپ کو آپریشن کے اس سلسلے کو یاد رکھنے کی ضرورت ہے ۔ جب ہم نے پچھلے اسباق میں آبجیکٹ بنانے کے عمل کے بارے میں بات کی تھی، تو آپ واقعی وراثت کے بارے میں ابھی تک کچھ نہیں جانتے تھے، اس لیے کچھ چیزوں کی وضاحت کرنا مشکل تھا۔ اب آپ کو بہت کچھ معلوم ہے اور ہم آخر کار اس سوال پر مکمل غور کر سکتے ہیں :) تو تیسرا نکتہ کہتا ہے کہ " آخر میں متغیرات کو شروع کیا جاتا ہے اور کنسٹرکٹر کو کہا جاتا ہے۔ " لیکن یہ سب کس ترتیب سے ہوتا ہے؟ بہتر تفہیم کے لیے، آئیے دو انتہائی آسان کلاسز بنائیں — ایک والدین اور ایک بچہ:
public class Vehicle {

   public static int vehicleCounter = 0;

   private String description = "Vehicle";
   public Vehicle() {
   }

   public String getDescription() {
       return description;
   }
}

public class Truck extends Vehicle {

   private static int truckCounter = 0;

   private int yearOfManufacture;
   private String model;
   private int maxSpeed;

   public Truck(int yearOfManufacture, String model, int maxSpeed) {
       this.yearOfManufacture = yearOfManufacture;
       this.model = model;
       this.maxSpeed = maxSpeed;

       Vehicle.vehicleCounter++;
       truckCounter++;
   }
}
کلاس Truckایک ٹرک کا نفاذ ہے جس میں فیلڈز اس کے سال، ماڈل اور زیادہ سے زیادہ رفتار کی نمائندگی کرتے ہیں۔ اب ہم ایک ایسی چیز بنانا چاہتے ہیں:
public class Main {

   public static void main(String[] args) throws IOException {

       Truck truck = new Truck(2017, "Scania S 500 4x2", 220);
   }
}
جاوا مشین میں، عمل اس طرح نظر آئے گا:
  1. پہلی چیز جو ہوتی ہے وہ ہے کلاس کے جامد متغیرات کو Vehicleشروع کیا جاتا ہے ۔ ہاں، میں نے Vehicleکلاس میں کہا، نہیں Truck۔ کنسٹرکٹرز کو بلائے جانے سے پہلے جامد متغیرات کو شروع کیا جاتا ہے، اور یہ پیرنٹ کلاس میں شروع ہوتا ہے۔ آئیے اس کی تصدیق کرنے کی کوشش کرتے ہیں۔ ہم کلاس vehicleCounterمیں فیلڈ کو Vehicle10 کے برابر سیٹ کرتے ہیں اور اسے کنسٹرکٹرز Vehicleاور دونوں میں ظاہر کرنے کی کوشش کرتے ہیں۔Truck

    public class Vehicle {
    
       public static int vehicleCounter = 10;
       private String description = "Vehicle";
    
       public Vehicle() {
           System.out.println(vehicleCounter);
       }
    
       public String getDescription() {
           return description;
       }
    }
    
    public class Truck extends Vehicle {
    
       private static int truckCount = 0;
    
       private int yearOfManufacture;
       private String model;
       private int maxSpeed;
    
       public Truck(int yearOfManufacture, String model, int maxSpeed) {
           System.out.println(vehicleCounter);
           this.yearOfManufacture = yearOfManufacture;
           this.model = model;
           this.maxSpeed = maxSpeed;
    
           Vehicle.vehicleCounter++;
           truckCount++;
       }
    }

    ہم نے جان بوجھ کر پرنٹ ایل این اسٹیٹمنٹ کو کنسٹرکٹر کے بالکل شروع میں ڈال دیا ہے Truckتاکہ یہ یقینی بنایا جا سکے کہ ٹرک کے فیلڈز کو ابھی تک شروع نہیں کیا گیا ہے جب vehicleCounterڈسپلے کیا جائے گا۔

    اور یہاں نتیجہ ہے:

    10
    10
  2. پیرنٹ کلاس کے جامد متغیرات کو شروع کرنے کے بعد، چائلڈ کلاس کے جامد متغیرات کو شروع کیا جاتا ہے۔ ہمارے معاملے میں، یہ کلاس truckCounterکا میدان ہے Truck۔

    آئیے ایک اور تجربہ کرتے ہیں جہاں ہم دوسرے فیلڈز کو شروع کرنے سے پہلے کنسٹرکٹر کے truckCounterاندر کی قدر ظاہر کرنے کی کوشش کریں گے :Truck

    public class Truck extends Vehicle {
    
       private static int truckCounter = 10;
    
       private int yearOfManufacture;
       private String model;
       private int maxSpeed;
    
       public Truck(int yearOfManufacture, String model, int maxSpeed) {
           System.out.println(truckCounter);
           this.yearOfManufacture = yearOfManufacture;
           this.model = model;
           this.maxSpeed = maxSpeed;
    
           Vehicle.vehicleCounter++;
           truckCounter++;
       }
    }

    جیسا کہ آپ دیکھ سکتے ہیں، جب کنسٹرکٹر شروع ہوتا ہے تو قیمت 10 پہلے ہی ہمارے جامد متغیر کو تفویض کی گئی ہے ۔Truck

  3. تعمیر کرنے والوں کے لیے اب بھی وقت نہیں آیا! متغیر ابتداء جاری ہے۔ پیرنٹ کلاس کے غیر جامد متغیرات کو تیسرے نمبر پر شروع کیا جاتا ہے۔ جیسا کہ آپ دیکھ سکتے ہیں، وراثت کسی چیز کو بنانے کے عمل کو نمایاں طور پر پیچیدہ بناتی ہے، لیکن آپ اس کے بارے میں کچھ نہیں کر سکتے: آپ کو پروگرامنگ میں صرف کچھ چیزیں حفظ کرنی ہوں گی :)

    ایک تجربے کے طور پر، ہم کلاس descriptionمیں متغیر کو کچھ ابتدائی قدر تفویض کر سکتے ہیں Vehicle، اور پھر اسے کنسٹرکٹر میں تبدیل کر سکتے ہیں۔

    public class Vehicle {
    
       public static int vehicleCounter = 10;
    
       private String description = "Initial value of the description field";
    
       public Vehicle() {
           System.out.println(description);
           description = "Vehicle";
           System.out.println(description);
       }
    
       public String getDescription() {
           return description;
       }
    }

    آئیے اپنا main()طریقہ چلائیں جو ٹرک بناتا ہے:

    public class Main {
    
       public static void main(String[] args) throws IOException {
    
           Truck truck = new Truck(2017, "Scania S 500 4x2", 220);
       }
    }

    ہمیں مندرجہ ذیل نتیجہ ملتا ہے:

    
    Initial value of the description field 
    Vehicle

    اس سے ثابت ہوتا ہے کہ جب Vehicleکنسٹرکٹر شروع ہوتا ہے تو descriptionفیلڈ کو پہلے ہی ایک قدر تفویض کر دی جاتی ہے۔

  4. آخر میں، یہ تعمیر کرنے والوں کے لئے وقت ہے! زیادہ واضح طور پر، یہ بیس کلاس کنسٹرکٹر کے لئے وقت ہے. اسے آبجیکٹ بنانے کے عمل کے چوتھے مرحلے میں استعمال کیا جاتا ہے۔

    اس کی تصدیق کرنا بھی کافی آسان ہے۔ آئیے کنسول میں دو لائنیں نکالنے کی کوشش کریں: ایک Vehicleبیس کلاس کنسٹرکٹر کے اندر، دوسری Truckکنسٹرکٹر کے اندر۔ ہمیں اس بات پر یقین کرنے کی ضرورت ہے کہ اندر کی لکیر Vehicleپہلے ظاہر ہوتی ہے:

    public Vehicle() {
    
       System.out.println("Hello from the Vehicle constructor!");
    }
    
    public Truck(int yearOfManufacture, String model, int maxSpeed) {
    
       System.out.println("Hello from the Truck constructor!");
       this.yearOfManufacture = yearOfManufacture;
       this.model = model;
       this.maxSpeed = maxSpeed;
    
       Vehicle.vehicleCounter++;
       truckCounter++;
    }

    ہم اپنا طریقہ چلائیں گے main()اور نتیجہ دیکھیں گے:

    Hello from the Vehicle constructor!
    Hello from the Truck constructor!

    بہترین اس کا مطلب ہے کہ ہم غلط نہیں ہیں :) آئیے آگے بڑھتے ہیں۔

  5. اب وقت آگیا ہے کہ چائلڈ کلاس کے غیر جامد فیلڈز کو شروع کیا جائےTruck ، یعنی ہماری کلاس۔ کلاس کے اندر فوری طور پر فیلڈز کو پانچویں مرحلے تک شروع نہیں کیا جاتا ہے! حیرت انگیز، لیکن سچ :) ایک بار پھر، ہم ایک سادہ چیک کریں گے — بالکل اسی طرح جیسے پیرنٹ کلاس کے ساتھ: ہم متغیر کی کچھ ابتدائی قدر کریں گے maxSpeedاور Truckکنسٹرکٹر میں ہم چیک کریں گے کہ کنسٹرکٹر کے شروع ہونے سے پہلے ویلیو تفویض کی گئی تھی:

    public class Truck extends Vehicle {
    
       private static int truckCounter = 10;
    
       private int yearOfManufacture;
       private String model;
       private int maxSpeed = 150;
    
       public Truck(int yearOfManufacture, String model, int maxSpeed) {
    
           System.out.println("Initial value of maxSpeed = " + this.maxSpeed);
           this.yearOfManufacture = yearOfManufacture;
           this.model = model;
           this.maxSpeed = maxSpeed;
    
           Vehicle.vehicleCounter++;
           truckCounter++;
       }
    }

    کنسول آؤٹ پٹ:

    Initial value of maxSpeed = 150

    جیسا کہ آپ دیکھ سکتے ہیں،  جب Truck کنسٹرکٹر شروع ہوتا ہے، maxSpeed پہلے ہی 150 کے برابر ہوتا ہے!

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

    اور صرف اس مقام پر، سب سے آخر میں، اس کلاس کے کنسٹرکٹر کو بلایا جائے گا جسے ہم انسٹیٹیوٹ کر رہے ہیں!

    صرف چھٹے مرحلے میں کھیتوں کو وہ اقدار تفویض کی جائیں گی جو ہم اپنے ٹرک کو دلائل کے طور پر دیتے ہیں۔

    جیسا کہ آپ دیکھ سکتے ہیں، ٹرک کو "تعمیر" کرنا، یعنی آبجیکٹ بنانے کا عمل آسان نہیں ہے۔ لیکن ایسا لگتا ہے کہ ہم نے اسے چھوٹے حصوں میں توڑ دیا ہے :)

آبجیکٹ کی تخلیق کے دوران اعمال کی ترتیب - 3 اس عمل کو اچھی طرح سمجھنا کیوں ضروری ہے؟ تصور کریں کہ ایک عام چیز بنانے کے نتائج کتنے غیر متوقع ہو سکتے ہیں اگر آپ بالکل نہیں جانتے تھے کہ کیا ہو رہا ہے "انڈر دی ہڈ" :) اب کورس پر واپس آنے اور کچھ کام مکمل کرنے کا وقت ہے! گڈ لک اور جلد ہی ملیں گے! :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION