Топ-100Интерфейсы в Java - CodOrbits
LogoCodOrbits

Раздел: ООП

Здесь вы познакомитесь с объектно-ориентированным программированием в Java: классы, наследование, инкапсуляция и полиморфизм и многое другое.

Все разделы
Иконка ООП

Интерфейсы в Java

Last updated: 4 мая 2025 г.

Интерфейсопределяет поведение классов.

В нем могут быть только поля и абстрактные методы (методы без реализаций, как мы помним).

Интерфейс создается с использованием ключевого слова interface.

Класс может реализовать интерфейс используя ключевое слово implements.

Search Icon

Также класс реализующий интерфейс обязан реализовать все его абстрактные методы.        

В интерфейсе не может  быть не абстрактных методов. То есть интерфейс – это каркас и классы создаются по этому каркасу. То есть интерфейс говорит классу – эй ты, класс, раз уж ты решил меня заимплементировать, в тебе обязательно должны быть поля с вот такими названиями, которые имеют вот такое содержимое и также в тебе должны быть методы с вот такими названиями.

Поясним на примере:

1//интерфейс с именем Flyable
2interface Flyable {
3    //поля
4    String species = "d";
5    int age = 10;
6
7    //и абстрактный метод
8    public void birdVoice();
9    //abstract уже не пишется так как
10    //это интерфейс, а не абстр. класс
11}
12
13//Пускай теперь Flyable заимплементят
14//(лучше так говорить реализуют) два класса.
15//От интерфейса они будут наследовать поля
16//и должны реализовать все
17//его абстрактные методы.
18
19class Parrot implements Flyable {
20    //реализуем абстрактный метод
21    public void birdVoice(){
22        System.out.println("RRAAAR!");
23    }
24};
25
26class Sparrow implements Flyable {
27    //реализуем абстрактный метод
28    public void birdVoice(){
29        System.out.println("Chick-Chirik");
30    }
31};
32
33class InterfaceExample {
34
35    //Сразу как пример использования
36    //интерфейсов приведем пример полиморфизма
37    //с интерфейсами. Приведем пример
38    //передачи в метод любого объекта
39    //класс которого реализует Flyable.
40    //Создадим такой метод.
41    public static void birdVoiceMethod(Flyable flyable){
42        flyable.birdVoice();
43    }
44
45    //Как видим в метод можно передать Flyable,
46    //а не конкретный Parrot или Sparrow.
47    //Значит что можем туда передать любой объект
48    //класс которого реализует Flyable.
49    //Например birdVoiceMethod(parrot);
50
51    public static void main(String[] args) {
52        Parrot parrot = new Parrot();
53        Sparrow sparrow = new Sparrow();
54
55        //выводим разные реализации
56        parrot.birdVoice();
57        sparrow.birdVoice();
58
59        //передаем объект попугая(он реализует Flyable)
60        birdVoiceMethod(parrot);
61        //передаем объект воробья(он тоже реализует Flyable)
62        birdVoiceMethod(sparrow);
63    }
64}

Вывод:


Интерфейсы vs Абстрактные классы

Абстрактные классы и интерфейсы часто сравнивают. Типа зачем интерфейсы если есть абстрактные классы? Или наоборот.

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

Search Icon

Хотя важно заметить, что сам объект абстрактного класса напрямую создать нельзя, он как бы создается когда мы создаем объект его наследника.

А у интерфейса нет экземпляра и не может быть, так как интерфейс это просто поведение или каркас, которого должен придерживаться реализующий его класс. Экземплярами могут быть только реализующие этот интерфейс классы.

Еще раз. Абстрактный класс это недопиленный класс, объект(экземпляр) которого имеет состояние, а интерфейс просто предоставляет поведение и в этом основная разница.

Как уже было сказано, поля абстрактного класса можно менять.

Продемонстрируем на примере:

1abstract class Animal {
2    String name = "Barsik";
3}
4
5class Cat extends Animal { }
6
7class AbstractClass {
8    public static void main(String[] args) {
9        Animal interfeceMutation = new Cat();
10        interfeceMutation.name = "Kuzya";
11        System.out.println(interfeceMutation.name);
12    }
13}

Вывод:

Поля же интерфейса менять нельзя. Их можно только извлекать.

Как можно увидеть ниже скомпилировать код в котором меняеться поле интерфейса не получиться.

1interface Animal {
2    String name = "Barsik";
3}
4
5class Cat implements Animal { }
6
7class InterfaceClass {
8    public static void main(String[] args) {
9        Animal interfeceMutation = new Cat();
10        interfeceMutation.name = "Kuzya";
11        System.out.println(interfeceMutation.name);
12    }
13}

Вывод:


Следующие уроки

Статические поля

10
мин.

Similar Articles Icon
Divider

Внутренний класс

12
мин.

Similar Articles Icon
Divider

Статический класс

14
мин.

Similar Articles Icon