Есть код:
public class Solution {
    public static void main(String[] args) {
        Swimmable animal = new Orca();
        animal.swim();
Вызываем метод swim() на переменной animal, которая ссылается на созданный объект класса Orca. Далее метод swim():
public void swim() {
           OceanAnimal currentAnimal = (OceanAnimal) getCurrentAnimal();
           currentAnimal.swimming();
Не понятно как программа понимает, что нужно вызвать метод getCurrentAnimal класса Orca, а не, например, Whale. Из-за того, что swim вызывается на объекте Orca? Даже если так, то мне все равно не понятна логика.