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

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

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

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

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

Search Icon

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

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

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

//интерфейс с именем Flyable interface Flyable { //поля String species = “d”; int age = 10; //и абстрактный метод public void birdVoice(); //abstract уже не пишется так как //это интерфейс, а не абстр. класс } //Пускай теперь Flyable заимплементят //(лучше так говорить реализуют) два класса. //От интерфейса они будут наследовать поля //и должны реализовать все //его абстрактные методы. class Parrot implements Flyable { //реализуем абстрактный метод public void birdVoice(){ System.out.println(“RRAAAR!”); } }; class Sparrow implements Flyable { //реализуем абстрактный метод public void birdVoice(){ System.out.println(“Chick-Chirik”); } }; class InterfaceExample { //Сразу как пример использования //интерфейсов приведем пример полиморфизма //с интерфейсами. Приведем пример //передачи в метод любого объекта //класс которого реализует Flyable. //Создадим такой метод. public static void birdVoiceMethod(Flyable flyable){ flyable.birdVoice(); } //Как видим в метод можно передать Flyable, //а не конкретный Parrot или Sparrow. //Значит что можем туда передать любой объект //класс которого реализует Flyable. //Например birdVoiceMethod(parrot); public static void main(String[] args) { Parrot parrot = new Parrot(); Sparrow sparrow = new Sparrow(); //выводим разные реализации parrot.birdVoice(); sparrow.birdVoice(); //передаем объект попугая(он реализует Flyable) birdVoiceMethod(parrot); //передаем объект воробья(он тоже реализует Flyable) birdVoiceMethod(sparrow); } }

Вывод:


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

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

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

Search Icon

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

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

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

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

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

abstract class Animal { String name = “Barsik”; } class Cat extends Animal { } class AbstractClass { public static void main(String[] args) { Animal interfeceMutation = new Cat(); interfeceMutation.name = “Kuzya”; System.out.println(interfeceMutation.name); } }

Вывод:

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

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

interface Animal { String name = “Barsik”; } class Cat implements Animal { } class InterfaceClass { public static void main(String[] args) { Animal interfeceMutation = new Cat(); interfeceMutation.name = “Kuzya”; System.out.println(interfeceMutation.name); } }

Вывод:

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

Статические поля и методы в Java: как они работают, общие для всех объектов класса, вызов без создания экземпляра и практические примеры кода.

Time to read: 10

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

Разбираем внутренние классы в Java: зачем они нужны, как связаны с внешним классом, доступ к приватным полям и пример

Time to read: 12

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

Узнайте, что такое статический класс в Java: его отличия от обычного внутреннего класса, доступ только к статическим полям и примеры использования в OOP.

Time to read: 14