Существует разница в производительности.
Каждый объект имеет указатель на свою таблицу vtable в заголовке объекта. Vtable содержит указатели на все виртуальные и абстрактные методы, определенные в иерархии типа объекта. Они упорядочены и имеют хорошо известные индексы, которые делают его эффективным для вызова такого метода. Вот как (в псевдокоде)
obj.vtable[0].call(); //this calls the method in the first slot (which might well be toString)
Но эта схема разваливается для интерфейсов, потому что это не представляется возможным назначить статические номера слотов в этом случае (потому что может быть огромное количество потенциальных интерфейсов и методов) , Из-за этого вызова интерфейса используется другой метод, который является более общим и более дорогим.