Интерфейс в Java: что это такое, implements и примеры - Вопросы
Всего: 7 вопросов
1. Что такое интерфейс в Java и как его создать?
Что такое интерфейс в 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 в 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 и какие модификаторы у его членов неявные?
Что может содержать интерфейс в 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- и 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-методом?
Что будет, если класс реализует два интерфейса с одинаковым default-методом?
Компилятор не может выбрать реализацию и выдаёт ошибку, пока класс не переопределит метод сам. Внутри переопределения можно вызвать реализацию конкретного интерфейса синтаксисом ИмяИнтерфейса.super.метод():
public class Smartphone implements Camera, Phone {
@Override
public String info() {
return Phone.super.info() + " с функцией: " + Camera.super.info();
}
}
Правила разрешения конфликтов: метод класса (в том числе унаследованный от суперкласса) важнее default-метода интерфейса; более конкретный интерфейс-наследник важнее родителя; в остальных случаях конфликт разрешает программист.
6. Что такое функциональный и маркерный интерфейс в Java?
Что такое функциональный и маркерный интерфейс в 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?
Чем интерфейс отличается от абстрактного класса в Java?
Основные отличия:
- Класс может наследовать (
extends) только один класс, но реализовать (implements) любое количество интерфейсов. Интерфейс может расширять сразу несколько интерфейсов:interface Football extends Sport, TVProgram. - У абстрактного класса могут быть поля экземпляра и конструкторы; у интерфейса — только константы
public static final, конструкторов нет. - Абстрактные методы интерфейса всегда
public; в абстрактном классе они могут бытьprotectedили package-private.
Абстрактный класс выбирают для общего состояния и кода родственных классов, интерфейс — для описания возможности (контракта), которую могут иметь несвязанные классы. Поэтому Java поддерживает множественное наследование типов через интерфейсы, но не множественное наследование состояния.