Разница в реализации JVM между интерфейсом и чистым абстрактным классом? - PullRequest
4 голосов
/ 22 февраля 2012

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

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

Ответы [ 3 ]

5 голосов
/ 22 февраля 2012

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

С 4.1. Структура ClassFile :

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 (языка).

2 голосов
/ 22 февраля 2012

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

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

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

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

1 голос
/ 22 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...