1. Ngunit hindi lang iyon.

Ipagpalagay na ang Cowklase ay may isang printAll()pamamaraan na tumatawag sa dalawang iba pang mga pamamaraan. Pagkatapos ang code ay gagana tulad nito:

Code Paglalarawan
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();
}
Ang output ng screen ay magiging:
I'm a white whale
I'm a whale

Tandaan na kapag ang printAll()pamamaraan sa Cowklase ay tinawag sa isang Whalebagay, ang printNameparaan ngWhale klase ang ginagamit, hindi ang nasa Cowpamamaraan.

Ang pangunahing bagay ay hindi ang klase kung saan nakasulat ang pamamaraan, ngunit ang uri (klase) ng bagay kung saan tinawag ang pamamaraan.

Ang mga non-static na pamamaraan lamang ang maaaring mamana at ma-override. Ang mga static na pamamaraan ay hindi minana at samakatuwid ay hindi maaaring i-override.

Narito kung ano ang Whalehitsura ng klase pagkatapos mag-apply ng inheritance at method overriding:

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");
   }
}
Narito ang Whalehitsura ng klase pagkatapos mag-apply ng inheritance at method overriding: Wala kaming alam tungkol sa anumang lumang printNameparaan.

2. Typecasting

Mayroong isang mas kawili-wiling punto dito. Dahil minana ng isang klase ang lahat ng pamamaraan at data ng parent class nito, ang isang reference sa isang object ng child class ay maaaring maimbak sa (nakatalaga sa) mga variable na ang uri ay kapareho ng parent class (at ang magulang ng magulang, atbp. — hanggang sa Objectklase). Halimbawa:

Code Paglalarawan
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printColor();
}
Ang output ng screen ay magiging:
I'm a white whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printColor();
}
Ang output ng screen ay magiging:
I'm a white whale
public static void main(String[] args)
{
   Object o = new Whale();
   System.out.println(o.toString());
}
Ang output ng screen ay magiging:
Whale@da435a.

Ang toString()pamamaraan ay minana mula sa Objectklase

Ito ay isang napakahalagang pag-aari: ilang sandali ay mauunawaan mo kung paano ito gamitin sa pagsasanay.


3. Pagtawag ng paraan sa isang bagay

Kapag ang isang pamamaraan ay tinawag sa isang variable, ang pamamaraan ay aktwal na tinatawag sa isang bagay. Ang mekanismong ito ay tinatawag na dynamic method dispatch.

Narito ang hitsura nito:

Code Paglalarawan
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printName();
}
Ang output ng screen ay magiging:
I'm a whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printName();
}
Ang output ng screen ay magiging:
I'm a whale

Tandaan na ang partikular na pagpapatupad ng printName()paraan na tatawagin — ang nasa Cowo ang nasa Whaleklase — ay hindi tinutukoy ng uri ng variable, ngunit sa uri ng bagay na tinutukoy ng variable.

Ang Cowvariable ay nag-iimbak ng isang sanggunian sa isang Whalebagay, at ang printName()pamamaraan na tinukoy sa Whaleklase ay kung ano ang tinatawag.

Hindi ito masyadong halata. Tandaan ang pangunahing panuntunan:

Ang hanay ng mga pamamaraan na magagamit upang tawagan sa isang variable ay tinutukoy ng uri ng variable. At ang tiyak na pagpapatupad ng pamamaraan na matatawag ay tinutukoy ng uri/klase ng bagay na tinutukoy ng variable.

Makikita mo ito sa lahat ng oras, kaya kapag mas maaga mong naaalala ito, mas mabuti.