Java Inheritance
Java में inheritance एक ऐसा mechanism है जिसमें एक object, अपने parent object के attributes और methods को प्राप्त कर लेता है। यानि की parent object के attributes और methods उस object को विरासत में मिल जाता है।
यह ठीक उसी तरह है जैसे एक child अपने parents के संपत्ति का इस्तेमाल कर सकता है। इसीलिए Java Inheritance, IS-A relationship का प्रतिनिधित्व करता है जिसे parent-child के रिश्ते के रूप में भी जाना जाता है।
यह OOPs (Object Oriented programming system) का एक महत्वपूर्ण हिस्सा है।
जावा में, inheritance का अर्थ मौजूदा classes के आधार पर नई classes बनाना है। एक class जो किसी अन्य दुसरे class को inherits किया है वह उस दुसरे class के methods और fields का पुन: उपयोग यानि की reuse कर सकता है। इसके अलावा, आप अपनी current class में नए fields और methods भी जोड़ सकते हैं।
Java में Inheritance की आवश्यकता क्यों है?
- Code Reusability: Superclass में लिखा गया कोड सभी subclasses के लिए सामान्य यानि common होता है। Child classes अपने parent class के कोड का उपयोग directly कर सकते हैं।
- Method Overriding: Method Overriding केवल inheritance के माध्यम से ही प्राप्त किया जा सकता है। यह उन तरीकों में से एक है जिसके द्वारा जावा रन टाइम Polymorphism प्राप्त प्राप्त की जा सकती है।
Terms used in Inheritance
- Sub Class (Child): Subclass वह class है जो दूसरे class को inherits करता है। इसे derived class, extended class, या child class भी कहा जाता है। Subclass अपने parent class के फ़ील्ड और मेथड के अतिरिक्त अपने खुद के फ़ील्ड और मेथड ऐड कर सकता है।
- Super Class (Parent): Superclass वह क्लास है जिसकी features विरासत में किसी दुसरे class को मिलती हैं। इसे base class या parent class के रूप में भी जाना जाता है। यानि की superclass की features को उसके subclass द्वारा इस्तेमाल किया जा सकता है।
How to Use Inheritance in Java?
किसी क्लास से inherit करने के लिए extends
कीवर्ड का उपयोग किया जाता है।
extends
कीवर्ड का उपयोग यह दर्शाता है कि आप किसी पहले से मौजूद क्लास से derived यानि
प्राप्त हुए हैं। दूसरे शब्दों में समझे तो “extends” का तात्पर्य increased functionality से है।
class SubclassName extends SuperclassName
{
//methods and fields
}
Types of inheritance in java
जावा में class के आधार पर inheritance तीन प्रकार के होते हैं।
- Single Inheritance
- Multilevel Inheritance
- Hierarchical Inheritance
ऊपर दिए गए तस्वीर में आप देख रहे होंगे types of inheritance पांच है जब कि जावा में क्लास के आधार पर inheritance तीन प्रकार के होते हैं: Single Inheritance, Multilevel Inheritance और Hierarchical Inheritance.
Single Inheritance
Single inheritance में एक क्लास (subclasses) को एक दूसरे क्लास (superclass) की features विरासत में मिलती हैं। नीचे दिए गए उदाहरण में, B class इनहेरिट किया है A class को, इसलिए इसे single inheritance कहते है।
// Parent class
class Animals {
public void eatMethod() {
System.out.println("Animals eats.");
}
}
class Dog extends Animals {
public void runMethod() {
System.out.println("Dog runs.");
}
}
// Main Method
public class Main {
public static void main(String[] args) {
Animals myObj1 = new Animals();
myObj1.eatMethod();
// myObj1.runMethod();
System.out.println("\n ------------------ \n");
Dog myObj2 = new Dog();
myObj2.eatMethod();
myObj2.runMethod();
}
}
Animals eats.
------------------
Animals eats.
Dog runs.
उद्धारण को समझते हैं
1st : उपरोक्त उदाहरण में, हमने दो क्लास बनाया है Animals और Dog.
2nd : पहला क्लास Animals में एक मेथड डिफाइन किया eatMethod()
.
3rd : ठीक उसी तरह दुसरे क्लास Dog में भी एक मेथड डिफाइन किया runMethod()
.
4th : परंतु जब हमने Dog क्लास बनाया तो उसमें "extends" कीवर्ड का इस्तेमाल किया, जो Animals क्लास को इनहेरिट कर रहा है, जिसका मतलब है कि अब Dog क्लास अपने पैरेंट Animals क्लास के सारे मेथड का इस्तेमाल कर सकता है।
5th : अब main मेथड में हम आ जाते हैं, यहां पर हमने Animals क्लास का एक ऑब्जेक्ट बनाया myObj1 और उसमें Animals क्लास के मेथड eatMethod()
को कॉल किया तो वह काल हो जा रहा है। लेकिन अगर हम Animals क्लास के ऑब्जेक्ट myObj1
के द्वारा Dog क्लास के मेथड को कॉल करने की कोशिश करेंगे तो यह एक कॉल नहीं होगा और एक error जनरेट करेगा। इसलिए आप देखेंगे की myObj1.runMethod()
को हमने कमेंट किया हुआ है। जिसका मतलब है कि superclass अपने subclass के मेथड का इस्तेमाल नहीं कर सकता है।
6th : अब हम Dog क्लास के ऑब्जेक्ट myObj2
बनाते हैं और इसमें हम Animals क्लास के मेथड eatMethod()
और Dog क्लास के अपने खुद के मेथड runMethod()
दोनों को कॉल करते हैं तो ये दोनों मेथड कॉल हो जाते है। ऐसा इसलिए क्योंकि हमने Dog क्लास को extends किया है Animals क्लास से यानी कि अब Animals क्लास के सारे मेथड, Dog क्लास directly इस्तेमाल कर सकता है।
Multilevel Inheritance
जब inheritance की एक श्रृंखला होती है, तो इसे multilevel inheritance के रूप में जाना जाता है। जैसा कि आप नीचे दिए गए उदाहरण में देख सकते हैं, Puppy क्लास Dog क्लास को इनहेरिट कर रहा है जो फिर से Animals क्लास को इनहेरिट कर रहा है, यहाँ पर पहले से ही inherited क्लास Dog को इनहेरिट किया जा रहा है इसलिए यह एक multilevel inheritance है।
// Parent class
class Animals {
public void eatMethod() {
System.out.println("Animals eats.");
}
}
class Dog extends Animals {
public void runMethod() {
System.out.println("Dog runs.");
}
}
class Puppy extends Dog {
public void cryMethod() {
System.out.println("Puppy Cries.");
}
}
// Main Method
public class Main {
public static void main(String[] args) {
Puppy myObj = new Puppy();
myObj.eatMethod();
myObj.runMethod();
myObj.cryMethod();
}
}
Animals eats.
Dog runs.
Puppy Cries.
उद्धारण को समझते हैं
1st : उपरोक्त उदाहरण में, हमने तीन क्लास बनाया है Animals, Dog और Puppy.
2nd : पहला क्लास Animals में एक मेथड डिफाइन किया
eatMethod()
.
3rd : दुसरे क्लास Dog में भी एक मेथड डिफाइन किया
runMethod()
.
4th : ठीक उसी तरह तीसरे क्लास Puppy में भी एक मेथड डिफाइन किया
cryMethod()
.
5th : जब हमने Dog क्लास को extends किया Animals क्लास से, तो अब Dog
क्लास अपने पैरेंट Animals क्लास के सारे मेथड को इस्तेमाल कर सकता है। यानि की अब Dog क्लास के पास
दो मेथड हो गए
पहला खुद का runMethod()
और अपने पैरेंट का eatMethod()
. यहाँ तक के
प्रोसेस Single Inheritance में आ जाते है।
6th : जब फाइनली हमने Puppy क्लास को extends किया Dog क्लास से, तो अब
Puppy क्लास Dog क्लास के सारे मेथड को इस्तेमाल कर सकता है। यानि की अब Puppy क्लास के पास तीन
मेथड हो गए पहला खुद का cryMethod()
और अपने पैरेंट Dog के दो
runMethod()
और eatMethod()
. अगर आप सोच रहे हैं कि Dog क्लास के पास दो
मेथड कहां से आ गए तो 5th पॉइंट को आप एक बार दोबारा देखें।
अब आपके मन में एक सवाल आ रहा होगा कि क्या Puppy क्लास डायरेक्टर Animals क्लास को extends कर सकता है, तो इसका जवाब है Yes बिल्कुल कर सकता है, परन्तु इस केस में वह multilevel inheritance के कैटेगरी में ना आकर Single Inheritance के कैटेगरी में आएगा। ऐसा इसलिए क्योंकि जब हमने Animals क्लास को extends किया तब वह पहले से ही किसी और क्लास से एक्सटेंड नहीं कर रहा है।
जब हम किसी क्लास को extends करते हैं जो पहले से किसी दूसरे क्लास को extends कर रहा हो तभी उसे मल्टीलेवल इन्हेरिटेंस कहा जाता हैं।
ऊपर दिए गए उदाहरण में जब हमने Dog क्लास को extends किया Animals क्लास से तब यहां तक वह सिंगल इन्हेरिटेंस था लेकिन जैसे ही हमने Puppy क्लास extends किया Dog क्लास से तब यहाँ पर यह मल्टीलेवल इन्हेरिटेंस बन गया। क्योंकि यहां पर Dog क्लास पहले से ही Animals क्लास से एक्सटेंड कर रखा हैं।
Hierarchical Inheritance
जब दो या दो से अधिक क्लास एक ही क्लास को inherits करते हैं, तो इसे hierarchical inheritance के रूप में जाना जाता है।
// Parent class
class Animals {
public void eatMethod() {
System.out.println("Animals eats.");
}
}
class Dog extends Animals {
public void runMethod() {
System.out.println("Dog runs.");
}
}
class Cat extends Animals {
public void jumpMethod() {
System.out.println("Cat jumps from roof.");
}
}
// Main Method
public class Main {
public static void main(String[] args) {
Cat myObj = new Cat();
myObj.eatMethod();
myObj.jumpMethod();
// myObj.runMethod(); // compile-time error
}
}
Animals eats.
Cat jumps from roof.
ऊपर दिए गए उदाहरण से आप समझ गए होंगे की Hierarchical Inheritance काम कैसे करता हैं, यानी की किसी एक parent class के मेथड को कई सारे child class द्वारा इन्हेरीट किया जा सकता है।
जैसे हमारे उदाहरण में Animals क्लास एक पैरंट क्लास है, जिसे Dog क्लास और Cat क्लास दोनों द्वारा एक्सटेंड किया जा रहा है यानी इन्हेरीट जा रहा है, यह ठीक उसी प्रकार है जैसे एक पिता का संपत्ति उसके सभी बच्चे इस्तेमाल कर सकते हैं, चाहे एक बच्चा हो या दस बच्चे हो।
Why multiple inheritance is not supported in java?
जटिलता को कम करने और भाषा को सरल बनाने के लिए, Java में multiple inheritance सपोर्ट नहीं करता है।
class One {
public void greeting() {
System.out.println("Good Morning!");
}
}
class Two {
public void greeting() {
System.out.println("Good Morning!");
}
}
class Three extends One, Two {
public static void main(String[] args) {
Three myObj = new Three();
myObj.greeting();
}
}
ऊपर के उदाहरण को देखकर हम समझने की कोशिश करेंगे की Java में मल्टीप्ल इन्हेरिटेंस क्यों नहीं सपोर्ट करता हैं।
सबसे पहले हमने दो क्लास बनाया क्लास One
और क्लास Two
और दोनों में समान मेथड
बनाया greeting()
नाम से जैसा कि हम जानते हैं कि जावा इन्हेरिटेंस Method Overriding के
कॉन्सेप्ट को सपोर्ट करता है।
अब हम क्लास Three
बनाते हैं और उसे extends करने की कोशिश करते है दो क्लास से,
One
और Two
से। फिर हम क्लास Three
के ऑब्जेक्ट बनाते हैं और उस
ऑब्जेक्ट से greeting()
मेथड को कॉल करने की कोशिश करेंगे। तो अब आप ही बताइए जावा कौन से
greeting()
मेथड को कॉल करें क्लास One के ग्रीटिंग मेथड को या क्लास Two के ग्रीटिंग मेथड
को, और यहीं पर जावा कंफ्यूज हो जाता है। इसी से बचने के लिए जावा मेंमल्टीप्ल इन्हेरिटेंस सपोर्ट नहीं
करता है।
अब जब जावा में Multiple Inheritance ही सपोर्ट नहीं करता है तो Hybrid Inheritance सपोर्ट करने का तो सवाल ही नहीं उठाता है, क्योंकि एक Hierarchical और Multiple Inheritance मिलकर ही ही Hybrid Inheritance का निर्माण करता हैं।
References Used:
"Inheritance In Java" by Smart Programming
"Head First Java" by Kathy Sierra and Bert