2012-02-21 2 views
4

Я и мои друзья задавались вопросом, есть ли разница между JVM между интерфейсами и чистыми абстрактными классами, или если это просто синтаксический сахар.JVM Разница между интерфейсом и чистым абстрактным классом?

Я действительно не понимаю, почему будет разница, но это может быть не так надуманно.

ответ

5

Насколько байткод (.class файл), то они совершенно разные:

От 4.1 The ClassFile Structure:

ClassFile { 
    //... 
    u2 constant_pool_count; 
    cp_info constant_pool[constant_pool_count-1]; 
    //... 
    u2 super_class; 
    u2 interfaces_count; 
    u2 interfaces[interfaces_count]; 
} 

Очевидно класс может иметь один суперкласс (abstract или нет) и несколько реализованных интерфейсов , Это ограничение JVM, а не ограничение на Java (язык).

1

Должна быть разница, поскольку абстрактные классы могут содержать реализации методов, где, поскольку интерфейсы не могут.

2

Существует разница в производительности.

Каждый объект имеет указатель на свою таблицу vtable в заголовке объекта. Vtable содержит указатели на все виртуальные и абстрактные методы, определенные в иерархии типа объекта. Они упорядочены и имеют хорошо известные индексы, которые делают его эффективным для вызова такого метода. Вот как (в псевдокоде)

obj.vtable[0].call(); //this calls the method in the first slot (which might well be toString) 

Но эта схема разваливается для интерфейсов, потому что это не представляется возможным назначить статические номера слотов в этом случае (потому что может быть огромное количество потенциальных интерфейсов и методов) , Из-за этого вызова интерфейса используется другой метод, который является более общим и более дорогим.

Смежные вопросы