Интерфейсы

Применение ключевого слова interface позволяет полностью абстрагировать интерфейс класса от его реализации. То есть с использованием ключевого слова interface можно задать действия, которые должен выполнять класс, но не то, как именно он должен это делать. Синтаксически интерфейсы аналогичны классам, но не содержат переменных экземпляров, а объявления их методов не содержат тела метода. На практике это означает, что можно объявлять интерфейсы, которые не делают никаких допущений относительно их реализации. Как только интерфейс определен, его может реализовать любое количество классов. Кроме того, один класс может реализовать любое число интерфейсов.

Чтобы реализовать интерфейс, класс должен создать полный набор методов, определенных интерфейсом. Однако каждый класс может определять нюансы своей реализации данного интерфейса. Ключевое слово interface позволяет в полной мере использовать концепцию полиморфизма под названием "один интерфейс, несколько методов".

Интерфейсы предназначены для поддержки динамического разрешения методов во время выполнения. Обычно чтобы вызов метода мог выполняться из одного класса в другом, оба класса должны присутствовать во время компиляции, дабы компилятор Java мог проверить совместимость сигнатур методов. Само по себе это требование создает статическую и нерасширяемую среду обработки классов. В такой системе функциональные возможности неизбежно передаются по иерархии классов все выше и выше, в результате чего механизмы будут становиться доступными все большему числу подклассов. Интерфейсы предназначены для предотвращения этой проблемы. Они изолируют определение метода или набора методов от иерархии наследования. Поскольку иерархия интерфейсов не совпадает с иерархией классов, классы, никак не связанные между собой в иерархии классов, могут реализовать один и тот же интерфейс. Именно здесь возможности интерфейсов проявляются наиболее полно.

На заметку! Интерфейсы добавляют большинство функциональных возможностей, требуемых многим приложениям, которым в обычных условиях в языках вроде С++ пришлось бы прибегать к использованию множественного наследования.