
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
। कंस्ट्रक्टर को बुलाए जाने से पहले स्टेटिक वैरिएबल को इनिशियलाइज़ किया जाता है, और यह पैरेंट क्लास में शुरू होता है। आइए इसे सत्यापित करने का प्रयास करें। हम फ़ील्ड को 10 के बराबर वर्गvehicleCounter
में सेट करते हैं और इसे कंस्ट्रक्टर्स दोनों में प्रदर्शित करने का प्रयास करते हैं।Vehicle
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