Интерфейсы в Java представляют собой классы, где все поля по умолчанию объявлены как public static final (константы), а все методы — абстрактные. Для объявления используется ключевое слово interface вместо class. Необходимо знание модификаторов доступа и абстрактных методов.
Что такое интерфейс?
Интерфейс описывает поведение класса, не реализуя его. Один интерфейс может быть реализован несколькими классами, каждый из которых реализует методы интерфейса по-своему. Это обеспечивает гибкость и расширяемость кода.
Создание интерфейса
Создание интерфейса аналогично созданию класса, но используется ключевое слово interface. Поля в интерфейсе объявляются как константы и неявно получают модификаторы public static final. Каждый метод является абстрактным, и ключевое слово abstract перед методами не требуется.
Пример интерфейса Ray:
interface Ray {
int get(int index);
boolean add(int val);
}
Интерфейс Ray содержит методы get, возвращающий элемент по индексу, и add, добавляющий элемент в массив. add возвращает true при успешном добавлении и false в противном случае.
Реализация интерфейса
Для реализации используется ключевое слово implements. Каждый класс, реализующий интерфейс, должен реализовать все его методы.
Пример класса MyRay, реализующего Ray:
class MyRay implements Ray {
private int[] arr = new int[50];
private int size = 0;
@Override
public int get(int index) {
return arr[index];
}
@Override
public boolean add(int val) {
if (size == arr.length) return false;
arr[size++] = val;
return true;
}
}
MyRay содержит массив arr и переменную size. Методы get и add реализуют методы из Ray. Аннотация @Override указывает на переопределение метода.
Использование интерфейса
Использование интерфейса осуществляется через объект класса, его реализующего.
Пример использования Ray и MyRay:
Ray aRay = new MyRay();
aRay.add(3);
aRay.add(23);
aRay.add(34);
aRay.add(8);
System.out.println(aRay.get(0)); // Вывод: 3
System.out.println(aRay.get(3)); // Вывод: 8
Пример с несколькими реализациями
Создадим класс Ray1, реализующий Ray с другой реализацией get:
class Ray1 implements Ray {
private int[] arr = new int[50];
private int size = 0;
@Override
public int get(int index) {
if (index < 0 || index >= size) return arr[0]; //Возвращаем первый элемент, если индекс некорректен
return arr[arr.length - 1 - index]; // Возвращает элемент с конца
}
@Override
public boolean add(int val) {
if (size == arr.length) return false;
arr[size++] = val;
return true;
}
}
Теперь можно использовать объекты обоих классов через Ray, демонстрируя полиморфизм:
Ray aRay = new MyRay();
Ray bRay = new Ray1();
// ... (код добавления элементов, аналогичный предыдущему примеру) ...
System.out.println(aRay.get(3)); // Вывод элемента с начала массива
System.out.println(bRay.get(3)); // Вывод элемента с конца массива
Интерфейсы обеспечивают гибкость, расширяемость, абстракцию поведения и полиморфизм, являясь мощным инструментом в Java.