There is a difference in performance.
Each object has a pointer to its own vtable in the object header. Vtable contains pointers to all virtual and abstract methods defined in the object type hierarchy. They are ordered and have well-known indexes that make it efficient to call such a method. Here's how (in pseudo code)
obj.vtable[0].call();
But this scheme is falling apart for interfaces, because in this case it is impossible to assign numbers of static slots (since there can be a huge number of potential interfaces and methods). Because of this invocation of the interface, a different method is used, which is more general and more expensive.
source share