Поскольку компилятор знает привязку во время компиляции. Например, если вы вызываете метод на интерфейсе, то компилятор не может знать, и привязка разрешается во время выполнения, потому что фактический объект, имеющий метод, вызываемый на нем, может быть одним из нескольких. Поэтому это время выполнения или динамическое связывание.
Ваш вызов привязан к классу Animal во время компиляции, потому что вы указали тип. Если вы передадите эту переменную в другой метод где-то в другом месте, никто не узнает (кроме вас, потому что вы ее написали), каков будет фактический класс. Единственный ключ - объявленный тип Animal.