नमस्ते! आज हम ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (OOP) के एक सिद्धांत पर करीब से नज़र डालेंगे: इनहेरिटेंस। हम कक्षाओं के बीच अन्य प्रकार के संबंधों का भी अध्ययन करेंगे: रचना और एकत्रीकरण।
यह विषय कठिन नहीं होगा: आपने पिछले पाठों में कई बार इनहेरिटेंस और इनहेरिटेंस के उदाहरणों का सामना किया है। आज, मुख्य बात यह होगी कि आप अपने ज्ञान को सुदृढ़ करें, वंशानुक्रम के तंत्र की अधिक विस्तार से जांच करें, और एक बार फिर से कुछ उदाहरणों को देखें। :) ठीक है चलते हैं!
जब हमारे पास कुछ दर्जन कार वर्ग होते हैं, तो डुप्लिकेट कोड की मात्रा वास्तव में गंभीर हो जाती है। सामान्य क्षेत्रों और विधियों (जिन्हें "राज्य" और "व्यवहार" भी कहा जाता है) को मूल वर्ग में ले जाने से हम बहुत समय और स्थान बचा सकते हैं। यदि किसी प्रकार के अद्वितीय गुण या विधियाँ हैं जो अन्य कार प्रकारों में नहीं हैं, तो कोई बड़ी बात नहीं है। आप उन्हें हमेशा एक वंशज वर्ग में बना सकते हैं, बाकी सभी से अलग।
फ़ील्ड्स के बारे में भी यही सच है: यदि किसी चाइल्ड क्लास में अद्वितीय गुण हैं, तो हम शांतिपूर्वक इन फ़ील्ड्स को चाइल्ड क्लास के अंदर घोषित कर देते हैं और चिंता करना बंद कर देते हैं। :) कोड का पुन: उपयोग करने की क्षमता वंशानुक्रम का मुख्य लाभ है। प्रोग्रामर के लिए, अतिरिक्त कोड न लिखना बहुत महत्वपूर्ण है। आप अपने काम में बार-बार इसका सामना करेंगे। कृपया कुछ और महत्वपूर्ण याद रखें: जावा में एकाधिक वंशानुक्रम नहीं है. प्रत्येक वर्ग को केवल एक वर्ग विरासत में मिलता है। हम भविष्य के पाठों में इसके कारणों के बारे में अधिक बात करेंगे। अभी के लिए, इसे याद रखें। वैसे, यह Java को कुछ अन्य OOP भाषाओं से अलग बनाता है। उदाहरण के लिए, सी ++ एकाधिक विरासत का समर्थन करता है। वंशानुक्रम के साथ सब कुछ कमोबेश स्पष्ट है। पर चलते हैं।

जावा में विरासत और इसके फायदे
जैसा कि आप निश्चित रूप से याद करते हैं, वंशानुक्रम एक तंत्र है जो आपको मौजूदा वर्ग (मूल वर्ग) के आधार पर एक नई कक्षा का वर्णन करने देता है। ऐसा करने में, नई कक्षा मूल वर्ग की संपत्तियों और कार्यक्षमता को उधार लेती है। आइए पिछले पाठों में दी गई विरासत का एक उदाहरण याद करें:
public class Car {
private String model;
private int maxSpeed;
private int yearOfManufacture;
public Car(String model, int maxSpeed, int yearOfManufacture) {
this.model = model;
this.maxSpeed = maxSpeed;
this.yearOfManufacture = yearOfManufacture;
}
public void gas() {
// Gas
}
public void brake() {
// Brake
}
}
public class Truck extends Car {
public Truck(String model, int maxSpeed, int yearOfManufacture) {
super(model, maxSpeed, yearOfManufacture);
}
}
public class Sedan extends Car {
public Sedan(String model, int maxSpeed, int yearOfManufacture) {
super(model, maxSpeed, yearOfManufacture);
}
}
हमारा एक निश्चित कार्यक्रम है जिसमें विभिन्न प्रकार की कारों के साथ काम करना शामिल है। यहां तक कि अगर आप कार के शौकीन नहीं हैं, तो आप शायद जानते होंगे कि दुनिया में कई प्रकार की कारें हैं। :) तदनुसार, हम कारों के सामान्य गुणों को एक सामान्य मूल वर्ग में अलग कर देंगे, जिसे कहा जाता है Car
। तो सभी कारों में क्या समानता है, चाहे उनका प्रकार कुछ भी हो? प्रत्येक कार के निर्माण का एक वर्ष, मॉडल का नाम और अधिकतम गति होती है। हम इन गुणों को model
, maxSpeed
, और yearOfManufacture
फ़ील्ड्स में रखते हैं। व्यवहार के अनुसार, कोई भी कार तेज और धीमी हो सकती है। :) हम इस व्यवहार को gas()
और में परिभाषित करते हैंbrake()
तरीके। इससे हमें क्या लाभ होता है? सबसे पहले, यह कोड की मात्रा को कम करता है। बेशक, हम मूल वर्ग के बिना कर सकते हैं। लेकिन चूँकि प्रत्येक कार को गति देने और धीमा करने में सक्षम होना चाहिए, इसलिए हमें , , , और कक्षाओं में gas()
और प्रत्येक अन्य कार वर्ग में brake()
विधियाँ बनानी होंगी। कल्पना कीजिए कि हमें कितना अतिरिक्त कोड लिखना होगा। और , , और फ़ील्ड्स के बारे में मत भूलिए : यदि हम मूल वर्ग से छुटकारा पा लेते हैं, तो हमें उन्हें प्रत्येक कार वर्ग में बनाना होगा! Truck
Sedan
F1Car
SportsCar
model
maxSpeed
yearOfManufacture

public class F1Car extends Car {
public void pitStop() {
// Only race cars make pit stops
}
public static void main(String[] args) {
F1Car formula1Car = new F1Car();
formula1Car.gas();
formula1Car.pitStop();
formula1Car.brake();
}
}
आइए फॉर्मूला वन रेस कारों को एक उदाहरण के रूप में देखें। अपने "रिश्तेदारों" के विपरीत, उनका एक अनूठा व्यवहार है - वे समय-समय पर एक गड्ढा बंद करते हैं। यह हमें परेशान नहीं करता है। हम पहले ही मूल वर्ग में सामान्य व्यवहार का वर्णन कर चुके हैं Car
, और वंशज वर्गों के विशिष्ट व्यवहार को उन वर्गों में जोड़ा जा सकता है। 
रचना और एकत्रीकरण
कक्षाओं और वस्तुओं को एक साथ जोड़ा जा सकता है। वंशानुक्रम एक "है-ए" संबंध का वर्णन करता है। शेर एक जानवर है। इस तरह के रिश्ते को विरासत का उपयोग करके आसानी से व्यक्त किया जाता है, जहांAnimal
मूल वर्ग है और Lion
बच्चा है। हालाँकि, सभी रिश्तों को इस तरह वर्णित नहीं किया गया है। उदाहरण के लिए, एक कीबोर्ड निश्चित रूप से कंप्यूटर से संबंधित है, लेकिन यह कंप्यूटर नहीं है । हाथ किसी न किसी तरह से एक व्यक्ति से संबंधित हैं, लेकिन वे एक व्यक्ति नहीं हैं। इन मामलों में, हमारे पास दूसरे प्रकार का संबंध है: "है-ए" नहीं, बल्कि "हैस-ए"। हाथ कोई व्यक्ति नहीं है, बल्कि एक व्यक्ति का हिस्सा है। कीबोर्ड कंप्यूटर नहीं है, बल्कि कंप्यूटर का एक हिस्सा है। रचना और एकत्रीकरण का उपयोग करके एक है-एक संबंध को कोड में वर्णित किया जा सकता है. अंतर रिश्ते की "सख्ती" में है। आइए एक सरल उदाहरण दें: हमारे पास एक Car
वर्ग है। हर कार में एक इंजन होता है। इसके अतिरिक्त, हर कार में यात्री होते हैं। Engine engine
और क्षेत्रों के बीच मूलभूत अंतर क्या है Passenger[] passengers
? तथ्य यह है कि यात्री A
कार में बैठे हैं इसका मतलब यह नहीं है कि यात्री B
कार C
में नहीं हैं। एक कार कई यात्रियों के अनुरूप हो सकती है। क्या अधिक है, यदि सभी यात्री एक कार से बाहर निकल जाते हैं, तब भी यह सुचारू रूप से कार्य करेगी। Car
वर्ग और सरणी के बीच का संबंध Passenger[] passengers
कम सख्त है। इसे एकत्रीकरण कहा जाता है । यह एकत्रीकरण का एक और अच्छा उदाहरण प्रदान करता है। मान लीजिए हमारे पास एक Student
वर्ग और एक हैStudentGroup
कक्षा। एक छात्र कई छात्र संगठनों में शामिल हो सकता है: एक भौतिकी क्लब, एक स्टार वार्स फैन क्लब और/या एक छात्र कॉमेडी क्लब। रचना एक कठोर प्रकार का संबंध है। रचना का उपयोग करते समय, एक वस्तु किसी वस्तु का हिस्सा होती है और उसी प्रकार की किसी अन्य वस्तु से संबंधित नहीं हो सकती। सबसे सरल उदाहरण एक कार इंजन है। एक इंजन एक कार का हिस्सा होता है और दूसरी कार का हिस्सा नहीं हो सकता। Car
जैसा कि आप देख सकते हैं, उनका रिश्ता और के बीच के रिश्ते की तुलना में बहुत सख्त है Passengers
। 
GO TO FULL VERSION