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परिभाषित केलेल्या पद्धतीला म्हणतात.

हे फार स्पष्ट नाही. मुख्य नियम लक्षात ठेवा:

व्हेरिएबलवर कॉल करण्यासाठी उपलब्ध पद्धतींचा संच व्हेरिएबलच्या प्रकारानुसार निर्धारित केला जातो. आणि विशिष्ट पद्धत अंमलबजावणी ज्याला कॉल केला जातो ते व्हेरिएबलद्वारे संदर्भित ऑब्जेक्टच्या प्रकार/वर्गाद्वारे निर्धारित केले जाते.

तुम्‍हाला हे सर्व वेळ भेटेल, त्यामुळे तुम्‍हाला हे जितक्या लवकर लक्षात येईल तितके चांगले.