У одного интерфейса могут быть несколько реализаций.
Animal - это интерфейс.
Соответственно, есть разные реализации. Например,
interface Animal {}
class Dog implements Animal {}
class Cat implements Animal {}
Вот, представьте следующую ситуацию. Вам необходимо написать либу для работы с БД. Притом БД могут быть разные. Это может быть и MySQL, PostgreSQL, SQLite и т.д.
Но у них у всех (независимо от БД) есть некие общие методы. Например,
connect()
&
disconnect()
Тогда создается некий интерфейс Connection
inteface Connection {
connect(){}
disconnect{}
}
Дальше создаются классы. Например,
class MySQLConnection implements Connection {}
class PostgreSQL implements Connection {}
и т.д.
в которых методы
connect() & disconnect()
реализуются.
Ну а дальше чтобы подключиться например к БД MySQL используют
Connection c = new MySQLConnection();
c.connect();
Если завтра попросят подключиться к другой БД, то поменяется только
new MySQLConnection();