जावा - वंशानुक्रम

वंशानुक्रम को उस प्रक्रिया के रूप में परिभाषित किया जा सकता है जहां एक वर्ग दूसरे के गुणों (तरीकों और क्षेत्रों) को प्राप्त करता है। विरासत के उपयोग के साथ सूचना को एक पदानुक्रमित क्रम में प्रबंधनीय बनाया जाता है।

जो वर्ग अन्य के गुणों को विरासत में देता है, उसे उपवर्ग (व्युत्पन्न वर्ग, बाल वर्ग) के रूप में जाना जाता है और जिस वर्ग के गुण विरासत में मिलते हैं उसे सुपरक्लास (आधार वर्ग, मूल वर्ग) के रूप में जाना जाता है।

कीवर्ड बढ़ाता है

extendsवह कीवर्ड है जिसका उपयोग किसी वर्ग के गुणों को प्राप्त करने के लिए किया जाता है। निम्नलिखित कीवर्ड का विस्तार है।

Syntax

class Super {
   .....
   .....
}
class Sub extends Super {
   .....
   .....
}

नमूना कोड

निम्नलिखित जावा विरासत का प्रदर्शन करने वाला एक उदाहरण है। इस उदाहरण में, आप गणना और My_Calacle नामक दो वर्गों का निरीक्षण कर सकते हैं।

कीवर्ड का उपयोग करते हुए, My_Calacle गणना वर्ग के अतिरिक्त () और घटाव () तरीकों को विरासत में मिला है।

निम्नलिखित प्रोग्राम को My_Calacle.java नाम की फ़ाइल में कॉपी और पेस्ट करें

Example

class Calculation {
   int z;
	
   public void addition(int x, int y) {
      z = x + y;
      System.out.println("The sum of the given numbers:"+z);
   }
	
   public void Subtraction(int x, int y) {
      z = x - y;
      System.out.println("The difference between the given numbers:"+z);
   }
}

public class My_Calculation extends Calculation {
   public void multiplication(int x, int y) {
      z = x * y;
      System.out.println("The product of the given numbers:"+z);
   }
	
   public static void main(String args[]) {
      int a = 20, b = 10;
      My_Calculation demo = new My_Calculation();
      demo.addition(a, b);
      demo.Subtraction(a, b);
      demo.multiplication(a, b);
   }
}

उपरोक्त कोड को संकलित और निष्पादित करें जैसा कि नीचे दिखाया गया है।

javac My_Calculation.java
java My_Calculation

कार्यक्रम को निष्पादित करने के बाद, यह निम्नलिखित परिणाम देगा -

Output

The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200

दिए गए कार्यक्रम में, जब कोई वस्तु My_Calculationवर्ग बनाया जाता है, उसके भीतर सुपरक्लास की सामग्री की एक प्रति बनाई जाती है। इसीलिए, उपवर्ग के ऑब्जेक्ट का उपयोग करके आप सुपरक्लास के सदस्यों तक पहुँच सकते हैं।

सुपरक्लास संदर्भ चर उप-वर्ग ऑब्जेक्ट को पकड़ सकता है, लेकिन उस चर का उपयोग करके आप केवल सुपरक्लास के सदस्यों तक ही पहुंच सकते हैं, इसलिए दोनों वर्गों के सदस्यों तक पहुंचने के लिए यह हमेशा उप-संदर्भ के लिए संदर्भ चर बनाने की सिफारिश की जाती है।

यदि आप उपरोक्त कार्यक्रम पर विचार करते हैं, तो आप नीचे दिए गए अनुसार कक्षा को तुरंत लिख सकते हैं। लेकिन सुपरक्लास संदर्भ चर का उपयोग करना (cal इस मामले में) आप विधि नहीं कह सकते multiplication(), जो कि उपवर्ग My_Calacle से संबंधित है।

Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);

Note- एक उपवर्ग अपने सुपरक्लास से सभी सदस्यों (क्षेत्रों, विधियों, और नेस्टेड वर्गों) को विरासत में मिला है। कंस्ट्रक्टर सदस्य नहीं हैं, इसलिए उन्हें उपवर्गों से विरासत में नहीं मिला है, लेकिन सुपरक्लास के निर्माता को उपवर्ग से आमंत्रित किया जा सकता है।

सुपर कीवर्ड

super कीवर्ड के समान है thisकीवर्ड। निम्नलिखित परिदृश्य हैं जहां सुपर कीवर्ड का उपयोग किया जाता है।

  • इसका उपयोग किया जाता है differentiate the members सुपरक्लास के उप-सदस्यों के सदस्यों से, यदि उनके नाम समान हैं।

  • इसका उपयोग किया जाता है invoke the superclass उपवर्ग से निर्माता।

सदस्यों को विभेदित करना

यदि एक वर्ग दूसरे वर्ग के गुणों को विरासत में प्राप्त कर रहा है। और अगर सुपरक्लास के सदस्यों के पास उप वर्ग के समान नाम हैं, तो इन चरों को अलग करने के लिए हम नीचे दिखाए गए अनुसार सुपर कीवर्ड का उपयोग करते हैं।

super.variable
super.method();

नमूना कोड

यह अनुभाग आपको एक कार्यक्रम प्रदान करता है जो के उपयोग को दर्शाता है super कीवर्ड।

दिए गए कार्यक्रम में, आपके पास दो कक्षाएं हैं जैसे कि सब_क्लास और सुपर_क्लास , दोनों में अलग-अलग कार्यान्वयन के साथ प्रदर्शन () नाम का एक तरीका है, और विभिन्न मूल्यों के साथ एक नाम का चर है। हम दोनों वर्गों के प्रदर्शन () विधि को लागू कर रहे हैं और दोनों वर्गों के चर संख्या के मूल्य को मुद्रित कर रहे हैं। यहाँ आप देख सकते हैं कि हमने उपवर्ग से सुपरक्लास के सदस्यों को अलग करने के लिए सुपर कीवर्ड का उपयोग किया है।

Sub_class.java नाम की फ़ाइल में प्रोग्राम को कॉपी और पेस्ट करें।

Example

class Super_class {
   int num = 20;

   // display method of superclass
   public void display() {
      System.out.println("This is the display method of superclass");
   }
}

public class Sub_class extends Super_class {
   int num = 10;

   // display method of sub class
   public void display() {
      System.out.println("This is the display method of subclass");
   }

   public void my_method() {
      // Instantiating subclass
      Sub_class sub = new Sub_class();

      // Invoking the display() method of sub class
      sub.display();

      // Invoking the display() method of superclass
      super.display();

      // printing the value of variable num of subclass
      System.out.println("value of the variable named num in sub class:"+ sub.num);

      // printing the value of variable num of superclass
      System.out.println("value of the variable named num in super class:"+ super.num);
   }

   public static void main(String args[]) {
      Sub_class obj = new Sub_class();
      obj.my_method();
   }
}

निम्नलिखित सिंटैक्स का उपयोग करके उपरोक्त कोड को संकलित और निष्पादित करें।

javac Super_Demo
java Super

कार्यक्रम को निष्पादित करने पर, आपको निम्नलिखित परिणाम मिलेगा -

Output

This is the display method of subclass
This is the display method of superclass
value of the variable named num in sub class:10
value of the variable named num in super class:20

सुपरक्लास कंस्ट्रक्टर का आह्वान

यदि एक वर्ग किसी अन्य वर्ग के गुणों को विरासत में प्राप्त कर रहा है, तो उपवर्ग स्वचालित रूप से सुपरक्लास के डिफ़ॉल्ट निर्माता को अधिग्रहित करता है। लेकिन अगर आप सुपरक्लास के एक पैरामीटर निर्मित निर्माता को कॉल करना चाहते हैं, तो आपको सुपर कीवर्ड का उपयोग करने की आवश्यकता है जैसा कि नीचे दिखाया गया है।

super(values);

नमूना कोड

इस खंड में दिए गए कार्यक्रम से पता चलता है कि सुपरक्लास के पैराट्राइज्ड कंस्ट्रक्टर को आमंत्रित करने के लिए सुपर कीवर्ड का उपयोग कैसे किया जाए। इस कार्यक्रम में एक सुपरक्लास और एक उपवर्ग शामिल हैं, जहां सुपरक्लास में एक पैरामीटर निर्मित निर्माता होता है जो पूर्णांक मान को स्वीकार करता है, और हमने सुपर-क्लास के पैरामीटर वाले निर्माता को आमंत्रित करने के लिए सुपर कीवर्ड का उपयोग किया।

Subclass.java नाम के साथ एक फ़ाइल में निम्नलिखित प्रोग्राम को कॉपी और पेस्ट करें

Example

class Superclass {
   int age;

   Superclass(int age) {
      this.age = age; 		 
   }

   public void getAge() {
      System.out.println("The value of the variable named age in super class is: " +age);
   }
}

public class Subclass extends Superclass {
   Subclass(int age) {
      super(age);
   }

   public static void main(String args[]) {
      Subclass s = new Subclass(24);
      s.getAge();
   }
}

निम्नलिखित सिंटैक्स का उपयोग करके उपरोक्त कोड को संकलित और निष्पादित करें।

javac Subclass
java Subclass

कार्यक्रम को निष्पादित करने पर, आपको निम्नलिखित परिणाम मिलेगा -

Output

The value of the variable named age in super class is: 24

आईएस-ए रिलेशनशिप

IS-A कहने का एक तरीका है: यह वस्तु उस वस्तु का एक प्रकार है। आइए देखते हैं कि कैसेextends वंशानुक्रम प्राप्त करने के लिए खोजशब्द का उपयोग किया जाता है।

public class Animal {
}

public class Mammal extends Animal {
}

public class Reptile extends Animal {
}

public class Dog extends Mammal {
}

अब, उपरोक्त उदाहरण के आधार पर, ऑब्जेक्ट-ओरिएंटेड शब्दों में, निम्नलिखित सत्य हैं -

  • पशु स्तनपायी वर्ग का सुपरक्लास है।
  • पशु सरीसृप वर्ग का सुपरक्लास है।
  • स्तनपायी और सरीसृप पशु वर्ग के उपवर्ग हैं।
  • डॉग स्तनपायी और पशु दोनों वर्गों का उपवर्ग है।

अब, यदि हम IS-A संबंध पर विचार करते हैं, तो हम कह सकते हैं -

  • स्तनपायी आईएस-ए एनिमल
  • सरीसृप IS-A पशु है
  • डॉग IS-A स्तनपायी
  • इसलिए: डॉग आईएस-ए एनिमल भी है

फैली हुई कीवर्ड के उपयोग के साथ, उपवर्ग सुपरक्लास के निजी गुणों को छोड़कर सुपरक्लास के सभी गुणों को प्राप्त करने में सक्षम होंगे।

हम आश्वासन दे सकते हैं कि स्तनपायी वास्तव में एक जानवर है जिसका उपयोग उदाहरण के लिए किया जाता है।

Example

class Animal {
}

class Mammal extends Animal {
}

class Reptile extends Animal {
}

public class Dog extends Mammal {

   public static void main(String args[]) {
      Animal a = new Animal();
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

यह निम्नलिखित परिणाम का उत्पादन करेगा -

Output

true
true
true

चूंकि हमें इसकी अच्छी समझ है extends कीवर्ड, आइए देखें कि कैसे implements कीवर्ड का उपयोग IS-A संबंध प्राप्त करने के लिए किया जाता है।

आम तौर पर, implementsएक इंटरफेस के गुणों को प्राप्त करने के लिए कक्षाओं के साथ कीवर्ड का उपयोग किया जाता है। Interfaces को कभी भी एक class के द्वारा नहीं बढ़ाया जा सकता है।

Example

public interface Animal {
}

public class Mammal implements Animal {
}

public class Dog extends Mammal {
}

Instof Keyword

हमें उपयोग करते हैं instanceof ऑपरेटर यह निर्धारित करने के लिए जाँच करता है कि क्या वास्तव में स्तनपायी पशु है, और कुत्ता वास्तव में एक पशु है।

Example

interface Animal{}
class Mammal implements Animal{}

public class Dog extends Mammal {

   public static void main(String args[]) {
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

यह निम्नलिखित परिणाम का उत्पादन करेगा -

Output

true
true
true

एच ए-ए संबंध

ये रिश्ते मुख्य रूप से उपयोग पर आधारित हैं। यह निर्धारित करता है कि क्या एक निश्चित वर्गHAS-Aनिश्चित बात। यह रिश्ता कोड के दोहराव को कम करने के साथ-साथ बग्स को कम करने में मदद करता है।

एक उदाहरण में देखें -

Example

public class Vehicle{}
public class Speed{}

public class Van extends Vehicle {
   private Speed sp;
}

इससे पता चलता है कि क्लास वैन एचएएस-ए स्पीड। स्पीड के लिए एक अलग वर्ग होने से, हमें पूरे कोड को वैन क्लास के अंदर स्पीड से संबंधित नहीं करना पड़ता है, जिससे स्पीड क्लास का कई अनुप्रयोगों में पुन: उपयोग करना संभव हो जाता है।

ऑब्जेक्ट-ओरिएंटेड फ़ीचर में, उपयोगकर्ताओं को परेशान होने की ज़रूरत नहीं है कि कौन सी वस्तु वास्तविक काम कर रही है। इसे प्राप्त करने के लिए, वान वर्ग वान वर्ग के उपयोगकर्ताओं से कार्यान्वयन विवरण छिपाता है। इसलिए, मूल रूप से ऐसा होता है कि उपयोगकर्ता वान वर्ग को एक निश्चित कार्रवाई करने के लिए कहेंगे और वान वर्ग या तो स्वयं कार्य करेगा या किसी अन्य वर्ग को कार्रवाई करने के लिए कहेगा।

वंशानुक्रम के प्रकार

नीचे दिखाए गए अनुसार विभिन्न प्रकार के वंशानुक्रम हैं।

याद रखने के लिए एक बहुत महत्वपूर्ण तथ्य यह है कि जावा कई उत्तराधिकार का समर्थन नहीं करता है। इसका मतलब है कि एक वर्ग एक से अधिक वर्ग का विस्तार नहीं कर सकता है। इसलिए निम्नलिखित अवैध है -

Example

public class extends Animal, Mammal{}

हालांकि, एक वर्ग एक या एक से अधिक इंटरफेस को लागू कर सकता है, जिसने जावा को कई विरासत की असंभवता से छुटकारा पाने में मदद की है।