

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
कक्षा से ले सकते हैं। क्या अधिक है, हम चाइल्ड क्लास कंस्ट्रक्टर में स्पष्ट रूप से बेस क्लास कंस्ट्रक्टर को कॉल कर सकते हैं। एक बेस क्लास को " सुपरक्लास " भी कहा जाता है। यही कारण है कि जावा बेस क्लास को इंगित करने के लिए कीवर्ड सुपर का उपयोग करता है। पिछले उदाहरण में
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
कंस्ट्रक्टर को बुलाया और दो फील्ड पास किए। स्पष्ट रूप से प्रारंभ करने के लिए हमारे पास केवल एक फ़ील्ड था: पूंछ , जो अंदर नहीं है Animal
। याद रखें कि हमने उल्लेख किया है कि जब कोई ऑब्जेक्ट बनाया जाता है तो पैरेंट क्लास कंस्ट्रक्टर को पहले कहा जाता है? इसलिए कंस्ट्रक्टर में सुपर() हमेशा पहले होना चाहिए! अन्यथा, कंस्ट्रक्टर तर्क का उल्लंघन किया जाएगा और प्रोग्राम एक त्रुटि उत्पन्न करेगा।
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
कक्षाओं में एक स्थिर चर जोड़ेंगे । क्लास में एनिमलकाउंट वेरिएबल पृथ्वी पर जानवरों की प्रजातियों की कुल संख्या और कैटकाउंट का प्रतिनिधित्व करेगा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 एनिमल बेस क्लास कंस्ट्रक्टर हो गया है! मस्तिष्क का वर्तमान मूल्य = मस्तिष्क वर्तमान मूल्य दिल = दिल बिल्ली वर्ग निर्माता शुरू हो गया है (पशु निर्माता पहले से ही समाप्त हो गया है) स्थिर चर का वर्तमान मूल्य कैटकाउंट = 37 पूंछ का वर्तमान मूल्य = बिल्ली वर्ग में पूंछ का प्रारंभिक मूल्य = पूंछ का वर्तमान मूल्य पूँछ इसलिए, अब हम स्पष्ट रूप से देख सकते हैं कि जब एक नई वस्तु बनाई जाती है तो वेरिएबल इनिशियलाइज़ेशन और कंस्ट्रक्टर कॉल का क्रम:
- बेस क्लास (
Animal
) के स्टेटिक वेरिएबल्स को इनिशियलाइज़ किया जाता है। हमारे मामले में,Animal
क्लास का वेरिएबल एनिमलकाउंट 7700000 पर सेट है। -
चाइल्ड क्लास (
Cat
) के स्टेटिक वेरिएबल्स को इनिशियलाइज़ किया जाता है।नोट: हम अभी भी
Animal
कंस्ट्रक्टर के अंदर हैं और हम पहले ही प्रदर्शित कर चुके हैं:एनिमल बेस क्लास कंस्ट्रक्टर चल रहा है
क्या एनिमल क्लास के वेरिएबल्स को पहले ही इनिशियलाइज़ किया जा चुका है?
स्थिर चर पशु गणना का वर्तमान मूल्य = 7700000
पशु वर्ग में मस्तिष्क का वर्तमान मूल्य = पशु वर्ग में मस्तिष्क का प्रारंभिक मूल्य
पशु वर्ग में हृदय का वर्तमान मूल्य = पशु वर्ग में हृदय का प्रारंभिक मूल्य
पहले से ही बिल्ली वर्ग के चर हैं प्रारंभ किया गया?
स्थिर चर कैटकाउंट = 37 का वर्तमान मूल्य -
फिर बेस क्लास के नॉन-स्टैटिक वेरिएबल्स को इनिशियलाइज़ किया जाता है। हमने विशेष रूप से उन्हें प्रारंभिक मान निर्दिष्ट किए हैं, जिन्हें बाद में कंस्ट्रक्टर में बदल दिया जाता है। एनिमल कंस्ट्रक्टर अभी तक पूरा नहीं हुआ है, लेकिन मस्तिष्क और हृदय के प्रारंभिक मान पहले ही असाइन किए जा चुके हैं:
एनिमल बेस क्लास कंस्ट्रक्टर चल रहा है
क्या एनिमल क्लास के वेरिएबल्स को पहले ही इनिशियलाइज़ किया जा चुका है?
स्थिर चर पशु गणना का वर्तमान मूल्य = 7700000
पशु वर्ग में मस्तिष्क का वर्तमान मूल्य = पशु वर्ग में मस्तिष्क का प्रारंभिक मूल्य
पशु वर्ग में हृदय का वर्तमान मूल्य = पशु वर्ग में हृदय का प्रारंभिक मूल्य -
बेस क्लास कंस्ट्रक्टर शुरू होता है।
हमने पहले ही खुद को आश्वस्त कर लिया है कि यह चरण चौथा है: कंस्ट्रक्टर की शुरुआत में पहले तीन चरणों मेंAnimal
, कई चरों को पहले से ही मान दिए गए हैं। -
चाइल्ड क्लास (
Cat
) के नॉन-स्टैटिक फील्ड को इनिशियलाइज़ किया जाता है।
यहCat
कंस्ट्रक्टर के चलने से पहले होता है।
जब यह चलना शुरू होता है, पूंछ चर में पहले से ही एक मान होता है:कैट क्लास कंस्ट्रक्टर शुरू हो गया है (एनिमल कंस्ट्रक्टर पहले ही समाप्त हो चुका है) स्टैटिक वेरिएबल कैटकाउंट का वर्तमान मूल्य = 37 टेल का वर्तमान मूल्य = कैट क्लास में टेल का प्रारंभिक मूल्य
-
चाइल्ड क्लास के कंस्ट्रक्टर को
Cat
कहा जाता हैऔर जावा में ऑब्जेक्ट बनाना ऐसा ही दिखता है!
मुझे कहना होगा कि हम रटने-सीखने के बड़े प्रशंसक नहीं हैं, लेकिन वैरिएबल इनिशियलाइज़ेशन और कंस्ट्रक्टर कॉल के क्रम को याद रखना सबसे अच्छा है ।
यह कार्यक्रम के प्रवाह और किसी विशेष क्षण में आपकी वस्तुओं की स्थिति के बारे में आपकी समझ को बहुत बढ़ा देगा।
इसके अलावा, कई वर्ग वंशानुक्रम का उपयोग नहीं करते हैं। इस स्थिति में, आधार वर्ग से संबंधित चरण लागू नहीं होते हैं।
अधिक पढ़ना: |
---|
GO TO FULL VERSION