Java для начинающих: Интерфейсы (interface) — просто и понятно

Интерфейсы в 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.

Что будем искать? Например,программа