Простое наследование классов мы рассмотрели в главе 3.5 Однако в Java запрещено непосредственное множественное наследование между классами, то есть у одного подкласса может быть только один суперкласс (в объявлении extends может быть указано имя одного класса). Это ограничение, впрочем, снимается с помощью некоторых приемов, которые мы рассмотрим в этой главе.
С помощью интерфейсов можно частично решить проблему множественного наследования объектов. Интерфейсы - это своего рода неполные классы: у них отсутствуют переменные представителей, а методы интерфейсов не могут содержать тела. Объявление интерфейса совершается с помощью слова interface:
interface имя_интерфейса {
тип имя_метода1 (тип формальная_переменная1, тип формальная_переменная2...)
...
тип имя_метода2 (тип формальная_переменная1, тип формальная_переменная2...)
тип имя_переменной_типа_final1 = значение;
...
тип имя_переменной_типа_final2 = значение;
}
Объявленные методы отделяются уже не фигурными скобками, а просто точкой с запятой. Все переменные в интерфейсе объявляются типа final. Это значит, что внутри класса мы не можем поменять их значения, поэтому при объявлении переменных в интерфейсах им необходимо присваивать значения.
interface myfirstinterface {
final int x = 4;
boolean method1 (int k);
}
Теперь, чтобы использовать интерфейс в нашем классе нужно воспользоваться оператором implements:
class MyFirstApplet extends java.applet.Applet implements myfirstinterface {
В отличие от суперклассов количество интерфейсов в вызове класса неограниченно. При их вызове из класса нужно не забывать разделять их запятыми.
Аналогично классам и методам существуют встроенные Java-интерфейсы.
Характерный пример использования встроенных интерфейсов - обработка событий:
нажатие клавиши, кнопки мыши или движение мыши. Обработку событий производят
слушатели событий. Для их вызова будем использовать интерфейсы:
class GraphicConvey extends java.applet.Applet implements MouseListener, MouseMotionListener {