Интерфейс в Java: что это такое, implements и примеры - Вопросы

Всего: 7 вопросов

1. 

Что такое интерфейс в Java и как его создать?

Интерфейс в Java — это ссылочный тип, который задаёт контракт: какие методы должен предоставить класс, без описания того, как они работают. Интерфейс объявляется ключевым словом interface вместо class; public-интерфейс лежит в файле с тем же именем (Moveable.java). Абстрактные методы записываются без тела — только сигнатура и точка с запятой, а переменные интерфейса — это константы public static final.

public interface Moveable {
    int RIGHT = 1;      // public static final
    void moveRight();   // public abstract
    void moveLeft();
}

Создать объект интерфейса нельзя: new Moveable() — ошибка компиляции. Но интерфейс можно использовать как тип переменной: Moveable m = new Transport();. Через такую переменную доступны только методы, объявленные в интерфейсе, даже если в классе Transport есть и другие методы.

2. 

Что означает implements в Java и каковы правила имплементации интерфейса?

Ключевое слово implements означает, что класс реализует (имплементирует) интерфейс. Правила имплементации:

  • класс обязан переопределить все абстрактные методы интерфейса (и его родительских интерфейсов);
  • реализующий метод должен быть public — сужать доступ при переопределении нельзя, иначе ошибка «attempting to assign weaker access privileges»;
  • @Override необязательна, но помогает компилятору проверить сигнатуру;
  • default-методы переопределять не нужно;
  • если реализованы не все абстрактные методы, класс должен быть abstract.

Класс может реализовать несколько интерфейсов через запятую и одновременно наследовать один класс. Порядок фиксирован: сначала extends, потом implements. Слово extends означает наследование: класс расширяет один класс, а интерфейс — один или несколько интерфейсов.

public class ElectricCar extends Car implements Moveable, Chargeable {
    // реализация методов Moveable и Chargeable
}
3. 

Что может содержать интерфейс в Java и какие модификаторы у его членов неявные?

  • Константы — неявно public static final: значение задаётся при объявлении, изменить его нельзя (Moveable.RIGHT = 5; не скомпилируется).
  • Абстрактные методы — неявно public abstract, без тела.
  • Вложенные классы и интерфейсы — неявно public static.
  • default-методы (Java 8) — public, с телом.
  • static-методы (Java 8) — по умолчанию public, с телом.
  • private- и private static-методы (Java 9) — с телом, для общего кода внутри интерфейса.

Поля экземпляра и конструкторы в интерфейсе недопустимы. Поэтому поле нельзя объявить protected, private или transient, а абстрактный метод — final, protected или private. Модификаторы public static final и public abstract писать необязательно.

4. 

Что такое default- и static-методы интерфейса в Java 8?

Метод по умолчанию (default) — метод интерфейса с реализацией. Классы, реализующие интерфейс, не обязаны его переопределять, но могут, если реализация по умолчанию не подходит. Главная причина появления — эволюция API: так в Collection добавили stream() и forEach(), не сломав существующие реализации.

Статический метод интерфейса (static) тоже имеет тело и вызывается без объекта — только через имя интерфейса, например List.of(). Он не наследуется: вызов через объект или через имя класса-реализации — ошибка компиляции.

public interface MyIf {
    int getNumber();

    default String describe() {
        return "Число: " + getNumber();
    }

    static int staticMethod() {
        return 0;
    }
}

// вызов: MyIf.staticMethod();
5. 

Что будет, если класс реализует два интерфейса с одинаковым default-методом?

Компилятор не может выбрать реализацию и выдаёт ошибку, пока класс не переопределит метод сам. Внутри переопределения можно вызвать реализацию конкретного интерфейса синтаксисом ИмяИнтерфейса.super.метод():

public class Smartphone implements Camera, Phone {
    @Override
    public String info() {
        return Phone.super.info() + " с функцией: " + Camera.super.info();
    }
}

Правила разрешения конфликтов: метод класса (в том числе унаследованный от суперкласса) важнее default-метода интерфейса; более конкретный интерфейс-наследник важнее родителя; в остальных случаях конфликт разрешает программист.

6. 

Что такое функциональный и маркерный интерфейс в Java?

Функциональный интерфейс — интерфейс ровно с одним абстрактным методом (default- и static-методы не считаются). Его можно реализовать лямбда-выражением или ссылкой на метод. Аннотация @FunctionalInterface необязательна, но заставляет компилятор проверить, что абстрактный метод один. Примеры из JDK: Runnable, Comparator, Function, Predicate.

@FunctionalInterface
public interface Calculator {
    int apply(int a, int b);
}

Calculator sum = (a, b) -> a + b;

Маркерный интерфейс (интерфейс-маркер) — интерфейс без методов и констант. Реализуя его, класс «помечает» себя, а JVM или библиотеки проверяют метку через instanceof. Примеры: Serializable и Cloneable. Cloneable не содержит метода clone() — он лишь разрешает Object.clone() создать копию вместо CloneNotSupportedException. В новом коде вместо маркеров чаще используют аннотации.

7. 

Чем интерфейс отличается от абстрактного класса в Java?

Основные отличия:

  • Класс может наследовать (extends) только один класс, но реализовать (implements) любое количество интерфейсов. Интерфейс может расширять сразу несколько интерфейсов: interface Football extends Sport, TVProgram.
  • У абстрактного класса могут быть поля экземпляра и конструкторы; у интерфейса — только константы public static final, конструкторов нет.
  • Абстрактные методы интерфейса всегда public; в абстрактном классе они могут быть protected или package-private.

Абстрактный класс выбирают для общего состояния и кода родственных классов, интерфейс — для описания возможности (контракта), которую могут иметь несвязанные классы. Поэтому Java поддерживает множественное наследование типов через интерфейсы, но не множественное наследование состояния.

Страница 1 из 1