Java Class Design #5

Use virtual method invocation

Tak na prawdę temat tego zagadnienia wyczerpałem już w drugim artykule z tego działu, ale ponieważ chce się trzymać założeń – jedno wymaganie, jeden artykuł, to zapraszam do zapoznania się z tym bardzo krótkim podsumowaniem.


Na skróty:

Repozytorium z przykładami [GitHub]


Co to jest metoda wirtualna?

Termin metody wirtualnej nie jest pojęciem ściśle powiązanym z Javą. Jest to określenie głównie kojarzone z językami C i C++. W internecie spotkałem się z opinią, że w przypadku Javy, lepiej byłoby to nazwać „dynamicznym wiązaniem”.

Tak czy inaczej, metoda wirtualna to nic innego, jak metoda, która może być poprawnie nadpisana przez dziedzica klasy.

Po szczegóły odsyłam do artykułu o nadpisywaniu metod.

Wywołanie metod wirtualnych

Posłużę się tutaj dokładnie tym samym przykładem, co we wcześniejszym, wspomnianym już artykule.

public class Animal {
  public void eat(){
    System.out.println("Animal is eating");
  }
}
public class Lion extends Animal {
  public void eat(){
    System.out.println("Lion is eating");
  }
}

Klasa Lion, dziedziczy po klasie Animal oraz nadpisuje jej metodę eat().

Animal animal = new Animal();
animal.eat();

Wykonanie takiego kodu nie pozostawia nam żadnych wątpliwości co do wyniku. Referencja typu Animal wskazuje na obiekt typu Animal. Na konsoli zostanie wypisane:

Animal is eating

Natomiast w takim przypadku:

Animal animal = new Lion();
animal.eat();

Referencja jest typu Animal, ale rzeczywisty obiekt jest innego typu, Lion. W momencie kompilacji, kompilator nie wie, z jakiej klasy metodę eat() wykorzysta. Wie tylko, że może z takiej metody skorzystać, bo jest ona zdefiniowana w klasie Animal. Dopiero w trakcie pracy programu, Maszyna Javy „zorientuje się” , że referencja typu Animal wskazuje na rzeczywisty obiekt, którego typ jest pochodną typu Animal i ma swoją własną definicję metody eat(). I to w tym momencie- w trakcie pracy aplikacji, dynamicznie zostanie wskazana metoda, której ciało ma się wykonać. Na konsolę zostanie wypisane:

Lion is eating

To właśnie jest wywołanie wirtualnej metody. Więcej filozofii w tym nie ma 🙂