1. De ez még nem minden.

Tegyük fel, hogy az Cowosztálynak van egy printAll()metódusa, amely két másik metódust is meghív. Ezután a kód így fog működni:

Kód Leírás
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();
}
A képernyő kimenete a következő lesz:
I'm a white whale
I'm a whale

Vegye figyelembe, hogy amikor az osztály printAll()metódusát egyCow objektumon hívják meg , akkor az osztály metódusa kerül felhasználásra, nem a metódusban lévő metódus .WhaleprintNameWhaleCow

A lényeg nem az osztály, amelybe a metódus van írva, hanem az objektum típusa (osztálya), amelyen a metódus meghívásra kerül.

Csak a nem statikus módszerek örökölhetők és felülírhatók. A statikus módszerek nem öröklődnek, ezért nem írhatók felül.

Így Whalenéz ki az osztály az öröklődés és a metódus felülbírálása után:

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");
   }
}
Így Whalenéz ki az osztály az öröklődés és a metódus felülbírálása után: Nem tudunk régi metódusról printName.

2. Típusírás

Van itt egy még érdekesebb pont. Mivel egy osztály örökli szülőosztályának összes metódusát és adatát, a gyermekosztály objektumára való hivatkozás olyan változókban tárolható (hozzárendelt), amelyek típusa megegyezik a szülőosztályéval (és a szülő szülőjével stb. ) egészen az osztályig Object). Példa:

Kód Leírás
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printColor();
}
A képernyő kimenete a következő lesz:
I'm a white whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printColor();
}
A képernyő kimenete a következő lesz:
I'm a white whale
public static void main(String[] args)
{
   Object o = new Whale();
   System.out.println(o.toString());
}
A képernyő kimenete a következő lesz:
Whale@da435a.

A metódus az osztályból toString()öröklődikObject

Ez egy nagyon értékes tulajdonság: egy kicsit később meg fogja érteni, hogyan kell használni a gyakorlatban.


3. Metódus hívása egy objektumon

Ha egy metódust egy változón hívjuk meg, akkor a metódus valójában egy objektumra kerül meghívásra. Ezt a mechanizmust dinamikus módszer-küldésnek nevezik.

Így néz ki:

Kód Leírás
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printName();
}
A képernyő kimenete a következő lesz:
I'm a whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printName();
}
A képernyő kimenete a következő lesz:
I'm a whale

Vegye figyelembe, hogy a printName()meghívott metódus konkrét megvalósítását – az osztályban lévőt Cowvagy az osztályban lévőt Whalenem a változó típusa határozza meg, hanem az objektum típusa, amelyre a változó hivatkozik.

A Cowváltozó egy objektumra való hivatkozást tárol Whale, és printName()az osztályban definiált metódust Whalehívják.

Ez nem túl nyilvánvaló. Ne feledje a fő szabályt:

A változóban meghívható metódusok halmazát a változó típusa határozza meg. A meghívandó konkrét metódusmegvalósítást pedig a változó által hivatkozott objektum típusa/osztálya határozza meg.

Mindig találkozni fogsz ezzel, tehát minél előbb eszedbe jut, annál jobb.