Я плохой рассказчик, если у меня нет цели объяснить что-то непонятное кому-то с конкретным запросом, поэтому разбираюсь в простом, ну и за одно напишу об этом тут. Я не придерживаюсь примера обучения JavaRush, как то, что сначала задать вопрос, а потом рассказывать, как это делать. Я сторонник сначала рассказать, а потом спрашивать, как и при рассказе, сначала показать, а потом объяснять.
Interface в Java - 1
BS: Действия == поведение, воспринимайте как синонимы, просто действия более правильно понимаются, это всегда нечто активное, а поведение может ничего не показывать.

interface — интерфейс

Что это? Пример листинга интерфейса (с generics):
public interface Store<T, ID> {
    void add(T t);
    void update(T t, ID i);
    void delete(ID i);
    T findOne(ID i);
    List<T> findAll();
}
Распространенный круд (от CRUD: Create, Read, Update, Delete) интерфейс. Не пугайтесь, все достаточно просто. Интерфейс этот означает, что работа со многими базами данных строится по такому принципу: нужно добавить запись, обновить запись, удалить и найти все записи. Вы еще 100 раз это встретите и сами столько же раз напишете почти такой же интерфейс. Обозначается public, потому что должен реализовываться (implements) классом. Что значит реализовываться классом? Все очень просто: он должен расписать в себе все методы интерфейса. Простейший пример реализации в классе:
void add (T t) {
	bookstore.add(t);
}
Вместо T t, будет подставляться некий дженерик. В двух словах это ТИП переменной, поэтому и обозначается чаще всего как T = Type. В нашем примере, допустим, может быть такой:
void add (Book book) {
	bookstore.add(book);
}
Естественно, на место Book book вы можете подставить любую переменную, которая вам нужна для вашей реализации. Для понимания можно теоретически представить, что T = Object, а поскольку в Java все является Object, можно определить туда также любой ваш класс/переменную. Единственный трабл будет возникать потом — эксепшены, если класс нулевой и т.п. Своими словами — некая программная структура, определяющая отношения между объектами, посредством разделения их на некие поведенческие части. Цель интерфейса — определение функционала для реализации его классом. То есть, описание сигнатур методов. Внутри интерфейса находятся названия методов, возвращающие и входящие значения, и все. Ну можно еще обозначить там какие-то переменные, но они сразу становятся неявно public static final, и могут быть доступны из любой части программы. Интерфейс описывает действия, а поэтому в нем находятся эти самые действия, т.е. функции или методы. Зачем это нужно? Что это упрощает или какие дает преимущества? Упрощение описания действий, поведения. Мы говорим что делать, а как это делать, каждый класс реализует сам. Экономия времени в больших проектах. Интерфейсы создаются в ситуациях, когда мы знаем, что нужно выполнить некоторую задачу, но как это сделать, может отличаться. Интерфейс описывает названия действий — это просто как направление некой абстракции. Хотя могут встречаться и интерфейсы без методов и полей, такие как маркеры, типа Cloneable, Remote и т.п. Возьмем всеми любимый пример с автомобилем. Интерфейс в нем будет описывать возможные действия машины, поворот руля или направление движения, набор скорости, остаток бензина и т.п. То есть те самые действия, которые могут быть у абсолютно любого автомобиля. Другими словами, мы опускаемся в дебри деградации на самый низший уровень создания самого первого автомобиля и своими мозгами додумываем, как он создавался и что у него было. Естественно, мы описываем это абстрактно и только для действий. Что было у самого первого авто? Руль был? Был, значит куда-то поворачивался, направление руля/движения. Колеса были? Да, значит ехал с какой-то скоростью, изменение скорости. Вот и весь интерфейс. Но в целом интерфейсы создаются под какую-то реализацию неких действий. Т.е. мы пишем программу для более конкретных, чем для вообще всего, что только можно придумать. Поэтому и сами интерфейсы будут содержать более четкие и конкретные методы. Конечно же они будут настолько абстрактны, насколько это возможно. Интерфейсы могут быть наследованы друг от друга как классы.
interface MyInterface extends NotMyinterface;
Интерфейсы реализовываются в классах. Реализовывать можно сколько угодно интерфейсов. В отличие от наследования, наследоваться только от одного.
class NewClass extends OldClass implements MyInterface, NotMyinterface;
Т.е. мы придумали какие-то действия, придумали им названия, входящие данные, возвращаемые данные, написали все это в интерфейсе, потом создали класс и добавили наш интерфейс к этом классу, т.е. реализовали наш интерфейс в этом классе. Далее все описаные в интерфейсе методы/функции, должны обязательно иметь реализацию. Ее можно сделать непосредственно в самом интерфейсе, добавив слово default перед методом и написав реализацию прямо в методе, подобно классу. Это стало возможным с 8-й версии Java. Также ее можно сделать в классе, который будет реализовывать этот интерфейс. Ну вот, интерфейс написали, заимплементили в класс, накатили реализацию в классе, можно запускать и тестить. Так же можно почитать в интерфейсах про:
  • Статические методы.
  • Приватные методы. (повтор кода)
  • Переменные/Константы.
  • Вложенные интерфейсы.
Но это уже лучше попозже, да и лишним голову забивать тоже вредно. Интересный вопрос, что такое Volvo? Class or Interface?
line1: Volvo v = new VolvoV2();
line2: Volvo v = new VolvoV3();
Помимо интерфейсов, стоит продолжить про Абстрактные классы и Классы. Может потом, когда будет еще пара часов свободных. ))) PS: Ребята, всю критику прошу под постом или в ЛС, я прекрасно понимаю, что она есть у всех ))) и мне всегда интересно ее услышать, потому что это повод стать немного лучше и опять таки продолжать двигаться вперед. На этом всем Вам огромное спасибо и удачи в программировании. )))