1. लेकिन यह सब नहीं है।

मान लीजिए कि Cowकक्षा में एक printAll()विधि है जो दो अन्य विधियों को बुलाती है। तो कोड इस तरह काम करेगा:

कोड विवरण
class Cow
{
   public void printAll()
   {
      printColor();
      printName();
   }

   public void printColor ()
   {
      System.out.println("I'm a white whale");
   }

   public void printName()
   {
      System.out.println("I'm a cow");
   }
}

class Whale extends Cow
{
   public void printName()
   {
      System.out.println("I'm a whale");
   }
}
public static void main(String[] args)
{
   Whale whale = new Whale ();
   whale.printAll();
}
स्क्रीन आउटपुट होगा:
I'm a white whale
I'm a whale

ध्यान दें कि जब कक्षा printAll()में विधि को किसी वस्तु परCow कहा जाता है , तो कक्षा की विधि का उपयोग किया जाता है, विधि में नहीं।WhaleprintNameWhaleCow

मुख्य बात वह वर्ग नहीं है जिसमें विधि लिखी गई है, बल्कि उस वस्तु का प्रकार (वर्ग) है जिस पर विधि को कहा जाता है।

केवल गैर स्थैतिक तरीकों को विरासत में मिला और ओवरराइड किया जा सकता है। स्थैतिक विधियाँ विरासत में नहीं मिली हैं और इसलिए इन्हें ओवरराइड नहीं किया जा सकता है।

Whaleइनहेरिटेंस और मेथड ओवरराइडिंग लागू करने के बाद क्लास इस तरह दिखती है :

class Whale
{
   public void printAll()
   {
      printColor();
      printName();
   }

   public void printColor()
   {
      System.out.println("I'm a white whale");
   }

   public void printName()
   {
      System.out.println("I'm a whale");
   }
}
इनहेरिटेंस और मेथड ओवरराइडिंग लागू करने के बाद क्लास इस तरह दिखती है : हम किसी भी पुराने मेथड Whaleके बारे में नहीं जानते हैं।printName

2. टाइपकास्टिंग

यहां एक और भी दिलचस्प बात है। क्योंकि एक वर्ग अपने मूल वर्ग के सभी तरीकों और डेटा को प्राप्त करता है, चाइल्ड क्लास के किसी ऑब्जेक्ट के संदर्भ को वेरिएबल्स (असाइन) में संग्रहीत किया जा सकता है जिसका प्रकार मूल वर्ग (और माता-पिता के माता-पिता, आदि) के समान है। कक्षा तक Object)। उदाहरण:

कोड विवरण
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printColor();
}
स्क्रीन आउटपुट होगा:
I'm a white whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printColor();
}
स्क्रीन आउटपुट होगा:
I'm a white whale
public static void main(String[] args)
{
   Object o = new Whale();
   System.out.println(o.toString());
}
स्क्रीन आउटपुट होगा:
Whale@da435a.

विधि वर्ग toString()से विरासत में मिली हैObject

यह एक बहुत ही मूल्यवान संपत्ति है: थोड़ी देर बाद आप समझेंगे कि इसे व्यवहार में कैसे उपयोग किया जाए।


3. किसी वस्तु पर विधि को कॉल करना

जब एक विधि को एक चर पर कहा जाता है, तो विधि वास्तव में एक वस्तु पर बुलाई जाती है। इस तंत्र को गतिशील विधि प्रेषण कहा जाता है।

यहाँ यह कैसा दिखता है:

कोड विवरण
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printName();
}
स्क्रीन आउटपुट होगा:
I'm a whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printName();
}
स्क्रीन आउटपुट होगा:
I'm a whale

ध्यान दें कि कॉल की जाने वाली विधि का विशिष्ट कार्यान्वयन printName()- एक Cowया कक्षा में एक Whale- चर के प्रकार से निर्धारित नहीं होता है, लेकिन उस वस्तु के प्रकार से होता है जिसे चर संदर्भित करता है।

चर Cowकिसी वस्तु के संदर्भ को संग्रहीत करता है Whale, और कक्षा printName()में परिभाषित विधि को Whaleकहा जाता है।

यह बहुत स्पष्ट नहीं है। मुख्य नियम याद रखें:

वेरिएबल पर कॉल करने के लिए उपलब्ध विधियों का सेट वेरिएबल के प्रकार से निर्धारित होता है। और विशिष्ट विधि कार्यान्वयन जिसे कॉल किया जाता है, वेरिएबल द्वारा संदर्भित ऑब्जेक्ट के प्रकार/वर्ग द्वारा निर्धारित किया जाता है।

आप इसे हर समय सामना करेंगे, इसलिए जितनी जल्दी आप इसे याद रखें, उतना बेहतर होगा।