जावा - ओवरराइडिंग

पिछले अध्याय में, हमने सुपरक्लास और उपवर्गों के बारे में बात की थी। यदि कोई वर्ग अपने सुपरक्लास से एक विधि प्राप्त करता है, तो उस विधि को ओवरराइड करने का एक मौका होता है बशर्ते कि वह अंतिम रूप से चिह्नित न हो।

ओवरराइडिंग का लाभ है: एक व्यवहार को परिभाषित करने की क्षमता जो उपवर्ग प्रकार के लिए विशिष्ट है, जिसका अर्थ है कि एक उपवर्ग अपनी आवश्यकता के आधार पर मूल वर्ग विधि को लागू कर सकता है।

ऑब्जेक्ट-ओरिएंटेड शब्दों में, ओवरराइडिंग का मतलब मौजूदा पद्धति की कार्यक्षमता को ओवरराइड करना है।

उदाहरण

आइए एक उदाहरण देखें।

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
   }
}

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

उत्पादन

Animals can move
Dogs can walk and run

उपरोक्त उदाहरण में, आप देख सकते हैं कि भले ही bएक प्रकार का जानवर है जो डॉग क्लास में मूव मेथड चलाता है। इसका कारण यह है: संकलन समय में, चेक को संदर्भ प्रकार पर बनाया गया है। हालाँकि, रनटाइम में, JVM ऑब्जेक्ट प्रकार का पता लगाता है और उस विशेष ऑब्जेक्ट से संबंधित विधि चलाएगा।

इसलिए, उपरोक्त उदाहरण में, कार्यक्रम ठीक से संकलन करेगा क्योंकि पशु वर्ग के पास विधि चाल है। फिर, रनटाइम पर, यह उस ऑब्जेक्ट के लिए विशिष्ट विधि चलाता है।

निम्नलिखित उदाहरण पर विचार करें -

उदाहरण

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
   public void bark() {
      System.out.println("Dogs can bark");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
      b.bark();
   }
}

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

उत्पादन

TestDog.java:26: error: cannot find symbol
      b.bark();
       ^
  symbol:   method bark()
  location: variable b of type Animal
1 error

यह प्रोग्राम b के संदर्भ प्रकार के बाद से संकलित समय त्रुटि को फेंक देगा। पशु के पास छाल के नाम से एक विधि नहीं है।

विधि अधिभाव के लिए नियम

  • तर्क सूची बिल्कुल वैसी ही होनी चाहिए जैसी कि ओवरराइड विधि।

  • सुपरक्लास में मूल ओवरराइड विधि में घोषित रिटर्न प्रकार एक ही होना चाहिए या रिटर्न प्रकार का एक उपप्रकार होना चाहिए।

  • ओवरराइड विधि की पहुँच स्तर की तुलना में एक्सेस स्तर अधिक प्रतिबंधात्मक नहीं हो सकता है। उदाहरण के लिए: यदि सुपरक्लास पद्धति को सार्वजनिक घोषित किया जाता है, तो उप वर्ग में ओवरराइडिंग विधि निजी या संरक्षित नहीं हो सकती है।

  • उदाहरण के तरीकों को केवल तभी ओवरराइड किया जा सकता है जब वे उपवर्ग द्वारा विरासत में मिले हों।

  • अंतिम घोषित की गई विधि को ओवरराइड नहीं किया जा सकता है।

  • स्थिर घोषित की गई विधि को ओवरराइड नहीं किया जा सकता है, लेकिन फिर से घोषित किया जा सकता है।

  • यदि कोई विधि विरासत में नहीं ली जा सकती है, तो उसे ओवरराइड नहीं किया जा सकता है।

  • उदाहरण के सुपरक्लास के समान पैकेज के भीतर एक उपवर्ग किसी भी सुपरक्लास पद्धति को ओवरराइड कर सकता है जिसे निजी या अंतिम घोषित नहीं किया गया है।

  • एक अलग पैकेज में एक उपवर्ग केवल सार्वजनिक या संरक्षित घोषित किए गए गैर-अंतिम तरीकों को ओवरराइड कर सकता है।

  • ओवरराइडिंग विधि अपवादों को फेंकता है या नहीं, इसकी परवाह किए बिना एक ओवरराइडिंग विधि किसी भी अनचेक अपवाद को फेंक सकती है। हालाँकि, ओवरराइडिंग विधि को ऐसे अपवादों को नहीं फेंकना चाहिए जो ओवरराइड विधि द्वारा घोषित किए गए की तुलना में नए या व्यापक हैं। ओवरराइडिंग विधि की तुलना में ओवरराइडिंग विधि संकीर्ण या कम अपवाद फेंक सकती है।

  • कन्स्ट्रक्टर्स को ओवरराइड नहीं किया जा सकता है।

सुपर कीवर्ड का उपयोग करना

जब एक अधिरोहित विधि के सुपरक्लास संस्करण का आह्वान किया जाता है super कीवर्ड का उपयोग किया जाता है।

उदाहरण

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      super.move();   // invokes the super class method
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal b = new Dog();   // Animal reference but Dog object
      b.move();   // runs the method in Dog class
   }
}

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

उत्पादन

Animals can move
Dogs can walk and run