
new
، اور سب کچھ تیار ہے :) یہاں ہم بات کریں گے کہ کمپیوٹر اور جاوا مشین کے اندر کیا ہوتا ہے جب ہم لکھتے ہیں، مثال کے طور پر:
Cat cat = new Cat();
ہم اس کے بارے میں پہلے بھی بات کر چکے ہیں، لیکن صرف اس صورت میں جب ہم آپ کو یاد دلائیں گے:
- سب سے پہلے، آبجیکٹ کو ذخیرہ کرنے کے لیے میموری مختص کی جاتی ہے۔
- اگلا، جاوا مشین آبجیکٹ کا حوالہ بناتی ہے (ہمارے معاملے میں حوالہ کیٹ بلی ہے)۔
- آخر میں، متغیرات کو شروع کیا جاتا ہے اور کنسٹرکٹر کو کہا جاتا ہے (ہم اس عمل کو مزید تفصیل سے دیکھیں گے)۔

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);
}
}
جاوا مشین میں، عمل اس طرح نظر آئے گا:
-
پہلی چیز جو ہوتی ہے وہ ہے کلاس کے جامد متغیرات کو
Vehicle
شروع کیا جاتا ہے ۔ ہاں، میں نےVehicle
کلاس میں کہا، نہیںTruck
۔ کنسٹرکٹرز کو بلائے جانے سے پہلے جامد متغیرات کو شروع کیا جاتا ہے، اور یہ پیرنٹ کلاس میں شروع ہوتا ہے۔ آئیے اس کی تصدیق کرنے کی کوشش کرتے ہیں۔ ہم کلاسvehicleCounter
میں فیلڈ کوVehicle
10 کے برابر سیٹ کرتے ہیں اور اسے کنسٹرکٹرز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
-
پیرنٹ کلاس کے جامد متغیرات کو شروع کرنے کے بعد، چائلڈ کلاس کے جامد متغیرات کو شروع کیا جاتا ہے۔ ہمارے معاملے میں، یہ کلاس
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
-
تعمیر کرنے والوں کے لیے اب بھی وقت نہیں آیا! متغیر ابتداء جاری ہے۔ پیرنٹ کلاس کے غیر جامد متغیرات کو تیسرے نمبر پر شروع کیا جاتا ہے۔ جیسا کہ آپ دیکھ سکتے ہیں، وراثت کسی چیز کو بنانے کے عمل کو نمایاں طور پر پیچیدہ بناتی ہے، لیکن آپ اس کے بارے میں کچھ نہیں کر سکتے: آپ کو پروگرامنگ میں صرف کچھ چیزیں حفظ کرنی ہوں گی :)
ایک تجربے کے طور پر، ہم کلاس
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
فیلڈ کو پہلے ہی ایک قدر تفویض کر دی جاتی ہے۔ -
آخر میں، یہ تعمیر کرنے والوں کے لئے وقت ہے! زیادہ واضح طور پر، یہ بیس کلاس کنسٹرکٹر کے لئے وقت ہے. اسے آبجیکٹ بنانے کے عمل کے چوتھے مرحلے میں استعمال کیا جاتا ہے۔
اس کی تصدیق کرنا بھی کافی آسان ہے۔ آئیے کنسول میں دو لائنیں نکالنے کی کوشش کریں: ایک
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!
بہترین اس کا مطلب ہے کہ ہم غلط نہیں ہیں :) آئیے آگے بڑھتے ہیں۔
-
اب وقت آگیا ہے کہ چائلڈ کلاس کے غیر جامد فیلڈز کو شروع کیا جائے
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 کے برابر ہوتا ہے! -
چائلڈ کلاس کے کنسٹرکٹر کو
Truck
کہا جاتا ہے۔اور صرف اس مقام پر، سب سے آخر میں، اس کلاس کے کنسٹرکٹر کو بلایا جائے گا جسے ہم انسٹیٹیوٹ کر رہے ہیں!
صرف چھٹے مرحلے میں کھیتوں کو وہ اقدار تفویض کی جائیں گی جو ہم اپنے ٹرک کو دلائل کے طور پر دیتے ہیں۔
جیسا کہ آپ دیکھ سکتے ہیں، ٹرک کو "تعمیر" کرنا، یعنی آبجیکٹ بنانے کا عمل آسان نہیں ہے۔ لیکن ایسا لگتا ہے کہ ہم نے اسے چھوٹے حصوں میں توڑ دیا ہے :)

GO TO FULL VERSION