Поскольку несколько человек, вероятно, уже ответили, интерфейсы могут быть использованы для обеспечения определенного поведения между классами, которые не будут реализовывать эти поведения таким же образом. Итак, реализуя интерфейс, вы говорите, что ваш класс имеет поведение интерфейса. Интерфейс IAnimal не был бы типичным интерфейсом, потому что классы Dog, Cat, Bird и т. Д. Являются типами животных и, вероятно, должны расширять его, что является случаем наследования. Вместо этого интерфейс в этом случае будет больше похож на поведение животных, например, IRunnable, IFlyable, ITrainable и т. Д.
Интерфейсы хороши для многих вещей, одним из ключевых является возможность подключения. Например, объявление метода, имеющего параметр List, позволит передавать все, что реализует интерфейс List, что позволяет разработчику позже удалить и подключить другой список без необходимости переписывать тонну кода.
Возможно, вы никогда не будете использовать интерфейсы, но если вы разрабатываете проект с нуля, особенно какой-то фреймворк, вам, вероятно, захочется ознакомиться с ними.
Я бы рекомендовал прочитать главу об интерфейсах в Java Design от Coad, Mayfield и Kern. Они объясняют это немного лучше, чем обычный вводный текст. Если вы не используете Java, вы можете просто прочитать начало главы, которая в основном представляет собой концепции.