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