Имплементация что это такое в java
Java — разница между extends и implements на примерах
После продолжительного программирования на C++ переходить на Java бывает болезненно. С одной стороны прославленный сборщик мусора, а с другой огромное множество принципиальных различий в подходах к программированию. Об одном таком отличии я сегодня расскажу подробнее.
Речь пойдет о наследовании в Java. В отличии от C++, где наследование могло быть множественным, здесь это не совсем так. Кроме того, привычный синтаксис через «:» заменился на целых два ключевых слова: extends и implements. Начну с первого.
Ключевое слово extends в Java
Действие ключевого слова в точности совпадает с его переводом, один класс расширяет другой, что является классическим наследованием. Правила видимости полей и методов сохранились: private доступны только в самом классе, protected в самом классе и во всех наследниках, к public методам и полям можно обращаться откуда угодно. Главное отличие от «сишного» наследования в том, что можно расширять только один класс. Я сейчас не буду рассуждать о том, насколько это удобно, скажу только, что со множественным наследованием в C++ постоянно творилась какая-то каша.
Небольшой пример наследования с помощью ключевого слова extends. Напишем класс Door, который будет описывать характеристики двери, мы можем создать объект этого класса и работать с ним, как с «просто дверью». С другой стороны напишем еще два класса: IronDoor и WoodDoor, которые будут расширять класс Door(== наследуются от класса Door), т.е. добавят свои характеристики к базовым.
Ключевое слово implements в Java
С ключевым словом implements связано чуть больше хитростей. Слово «имплементировать» можно понимать, как «реализовывать», а в тот самый момент, когда возникает слово «реализовывать», где-то недалеко появляются интерфейсы. Так вот конструкция public class Door implements Openable означает, что класс дверь реализует интерфейс «открывающийся». Следовательно класс должен переопределить все методы интерфейса. Главная фишка в том, что можно реализовывать сколь угодно много интерфейсов.
Зачем это нужно? Самый простой пример, который приходит в голову, два интерфейса: Openable и Closeble. В первом метод open, и метод close во втором. Они помогут научить нашу дверь закрываться и открываться.
В классах-потомках двери(железная и деревянная двери) тоже появятся методы открыть/закрыть, реализованные в классе Door. Но никто нам не запрещает их переопределить.
Заключение
Итак, главное отличие в том, что extends используется для наследования от класса в прямом смысле этого слова, а implements позволяет «реализовать интерфейс». На первый взгляд это кажется лишним, неудобным и непонятным, но стоит пару раз использовать по назначению и все встает на свои места. На сегодня у меня все, спасибо за внимание!
Имплементация что это такое в java
В этой статье сделана попытка объяснить некоторые термины объектно-ориентированного программирования Java, и ответить на вопросы: что значит слово extends в определении класса? Что значит слово implements в определении класса? В чем разница между extends и implements? Что такое interface? Что такое @Override?
extends это ключевое слово, предназначенное для расширения реализации какого-то существующего класса. Создается новый класс на основе существующего, и этот новый класс расширяет (extends) возможности старого.
implements это ключевое слово, предназначенное для реализации интерфейса (interface).
Оба ключевых слова extends и implements используются, когда Вы создаете свой собственный класс на языке Java. Различие между ними в том, что implements означает, что Вы используете элементы интерфейса в Вашем классе, а extends означает, что Вы создаете подкласс от класса, который расширяете (extend). В новом классе Вы можете расширить только один класс, но Вы можете реализовать столько интерфейсов, сколько захотите.
Java не поддерживает множественное наследование (multiple inheritance) для классов. Эта проблема также решается путем использования нескольких интерфейсов.
@Override ключевое слово, которое позволяет в дочернем классе заново создать реализацию метода родительского класса.
Пример реализации интерфейса (как используется ключевое слово implements):
Интерфейс также может содержать в себе декларации полей констант, аннотации, интерфейсы и даже классы.
Теперь пример расширения класса (применение ключевого слова extends):
Вот что получится в результате:
Чтобы лучше понять работу терминов extends, implements, interface, @Override, необходимо изучить принципы объектно-ориентированного программирования: динамическое связывание (dynamic binding), полиморфизм (polymorphism) и общее наследование (general inheritance) [1].
BestProg
Перед изучением данной темы рекомендуется изучить тему:
Содержание
Поиск на других ресурсах:
1. Для чего используются интерфейсы? Преимущества применения интерфейсов
Интерфейсы используются для создания полностью абстрактных, классов которые вообще не содержат реализации. Интерфейсы не содержат реализации. Таким образом, интерфейсы предназначены для описания того, что может быть реализовано классами, которые реализуют эти интерфейсы. Иными словами, интерфейсы указывают классам которые их реализуют, что может быть реализовано, но не как это должно быть реализовано. Интерфейсы описывают форму а не реализацию.
В интерфейсе указываются имена методов, списки аргументов и типы значений, которые возвращаются, но не тела (реализации) этих методов.
Использование интерфейсов дает следующие взаимосвязанные преимущества:
2. Общая форма объявления интерфейса. Ключевое слово interface
Общая форма объявления интерфейса имеет следующий вид:
3. Какая общая форма реализации интерфейса в классе? Ключевое слово implements
Если интерфейс определен, то его можно реализовать в классе. Общая форма реализации интерфейса в классе имеет вид:
4. Что нужно обязательно выполнить (реализовать) в классе, который реализует заданный интерфейс?
Если класс реализует интерфейс, то для данного класса устанавливаются следующие обязательства:
5. Примеры объявление интерфейсов и классов, которые их реализуют
Пример 1. В примере демонстрируется:
Пусть в пределах пакета в файле IMathFunctions.java объявлен интерфейс с именем IMathFunctions как показано ниже
В интерфейсе указываются следующие объявления:
После объявления интерфейса объявляется класс, который должен реализовать методы этого интерфейса. В нашем случае объявляется класс MathFunctions
Использование интерфейса в классе может быть, например, следующим
Реализация интерфейса помещается в файле IStrings.java и имеет следующий вид:
Реализация класса описывается в файле ProcessStrings.java и имеет следующий вид
6. Можно ли создать экземпляр (объект) интерфейса?
Поскольку, интерфейс содержит только объявление без реализации, то создать экземпляр интерфейса запрещено. Однако, ссылку на интерфейс объявить можно. Но при выделении памяти оператором new должен указываться конструктор класса, который реализует данный интерфейс.
7. Во скольких классах может быть реализованн интерфейс?
8. Сколько интерфейсов может реализовать один класс?
Класс может реализовать любое количество интерфейсов. В этом случае имена интерфейсов разделяются запятой. Например, в следующем коде
9. Какой тип доступа обязательно должны иметь методы, объявленные в интерфейсе?
10. Какой тип доступа по умолчанию имеют методы, объявленные в интерфейсе?
11. Как вызвать методы класса с помощью ссылок на интерфейсы?
Последовательность шагов следующая (см. пример с п. 5):
Использование метода method() с учетом интерфейса I может быть следующей:
12. Требования к объявлению переменных в интерфейсах
13. В каких случаях можно применять спецификатор доступа public в объявлении интерфейса?
Спецификатор доступа public можно применять перед именем интерфейса только в случае, когда интерфейс определен в файле, который имеет то же имя. Если имя интерфейса не совпадает с именем файла, то спецификатор public нельзя использовать в объявлении интерфейса.
14. Как добавить объявление интерфейса в Java Eclipse?
В системах, поддерживающих программирование на языке Java, добавление интерфейсов в проект реализовано с помощью специальных команд.
Чтобы добавить интерфейс в некоторый проект в системе программирования Java Eclipse нужно выполнить следующие шаги.
1. Активировать проект, в который нужно добавить интерфейс (рис. 1).
Рис. 1. Активация проекта с именем Project15 в Java Eclipse
2. Вызвать команду создания интерфейса
Рис. 2. Команда добавления интерфейса к проекту
В результате откроется окно «New Java Interface» (рисунок 3).
3. В окне «New Java Project» нужно выполнить следующие действия (см. рисунок 3):
4. После выбора кнопки Finish интерфейс с именем MyInterface будет добавлен к проекту Project15 как показано на рисунке 4.
Интерфейсы в ООП (Java), по-простому?
Объясните по-простому, на пальцах, зачем и для чего нужны интерфейсы (Java)? Все эти заумные книжные определения и формулировки, ясности совсем не прибавляют.
16 ответов 16
Общее определение: Интерфейс — это совокупность методов и правил взаимодействия элементов системы. Другими словами, интерфейс определяет как элементы будут взаимодействовать между собой.
Когда вы используете эти «объекты», вы уверены в том, что вы сможете использовать их подобным образом. Благодаря тому, что вы знакомы с их интерфейсом.
В программировании что-то похожее. Почему графическую часть программы часто называют интерфейсом? Потому, что она определяет каким образом вы сможете использовать основной функционал, заложенный в программе.
Предположим, у вас в программе есть следующие типы:
а сейчас посмотрим, как можно пользоваться тем, что у нас есть:
Как видите, используем мы их одинаково, но суть кроется в реализации методов:
Вам может показаться странным, но это именно то, что отличает человека от животного — использование интерфейсов вместо классов. Вы наверняка помните классический опыт с обезьяной, которую приучили гасить огонь водой из ведёрка; а потом поставили ведёрко на плот посреди бассейна, но обезьяна всё равно бегала по мостику на плот и черпала воду из ведёрка, вместо того, чтобы черпать воду прямо из бассейна. То есть обезьянка использовала класс Вода-в-Ведёрке вместо интерфейса Вода (и даже больше, скажу по секрету: вместо интерфейса Средство-для-Тушения).
Когда мы мыслим классами — уподобляемся животным. Люди мыслят (и программируют) интерфейсами.
По простому говорите? Ну ок, правда сейчас тут начнут плеваться всякие товарищи типо гуру 🙂
Понимание интерфейсов придёт со временем. Сколько не читай, сколько не объясняй, Вы Сами должны понять ту гибкость, тот масштаб действий, которые они предоставляют программисту. Пытайтесь их использовать. Библиотека классов Java предоставляет интерфейсы для реализации. Попробуйте их изучить, возможно это поможет Вам уловить всю мощь которую предоставляет программирование с использованием интерфейсов.
Не будем оригинальны и возьмем для примера дверь.
Что обычный человек может сделать с дверью? Открыть и закрыть.
Соответственно интерфейс для нее будет такой:
А теперь следите за руками. Объекту человек нужно пройти через дверь. Важно ему какая дверь перед ним дверь, деревянная, железная, с окошком, открывается она на себя или от себя, а может вообще сдвигается в бок? Нет, не важно. Ему важно, чтобы ее в принципе можно было открыть.
По этому, в классе «Человек» мы принимаем в метод «Пройти через дверь» не какую-то конкретную дверь, а в принципе «Дверь», потому что знаем, что у нее есть метод «Открыть».
Соответственно ниже пример двух объектов, реализующие интерфейс «Дверь» и которые можно передать «Человеку» в метод «Пройти через дверь», но реализующие разную логику для метола «Открыть».
Интерфейсом** объекта мы назовём набор операций (методов), которые он может совершать или которые можно совершать над ним. Например, интерфейс числа 3 называется, собственно, «Число» и включает в себя набор операций сложения, вычитания, умножения и деления. Реализовать этот интерфейс может любое количество типов/классов, например, типы ЦелоеЧисло, ВещественноеЧисло, КомплексноеЧисло, а также такие неочевидные типы как Интервал или Полином. В то же время, один и тот же тип может реализовать более чем один интерфейс. Так, ЦелоеЧисло кроме интерфейса Число может реализовать интерфейс Перечислимый – для этого в классе ЦелоеЧисло будет необходимо всего лишь доопределить операции «следующий» и «предыдущий».
Объясню без деталей.
Допустим, мы создали Framework, который определяет, совершил ли пользователь double-click по экрану.
Но мы решаем не определять поведение этой функции сами, а предоставить эту реализацию программисту, использующему наш фреймворк. Предоставление этой реализации можно сделать через механизм интерфейсов.
Функцию: что_делать_если_пользователь_кликнул_2_раза_по_экрану() засовываем в интерфейс.
И, таким образом, сам момент двойного клика по экрану определяет наш фреймворк, а вот что делать (рисовать звездочки на экране, запустить проигрывание музыки и т.д.) после этого события решает программист, который реализует наш интерфейс.
1) Взаимодействие с окружающим миром. Программы пишет не один человек, они состоят не из одного класса и зачастую не из одного пакета и модуля. И суть программы в том, что код разных авторов, разных модулей взаимодействует между собой. Самый простой пример: вы пользуетесь сторонними библиотеками. Вы нашли нужный вам класс, подключили библиотеку, которая его содержит и вызываете оттуда методы. В какой-то момент автор библиотеки решил изменить свой код, разве это редкость? Исправить выявленные баги, улучшить, расширить функционал. И это может оказаться для вас глубокой неожиданностью: ваш-то код завязан на его код! И ваш код внезапно ломается.
2) В Java в качестве ссылки на переменную может выступать интерфейс. Например, уместен следующий метод:
В этот метод можно передать любой объект которые имплементирует интерфейс Iterable. Конечно, и вызывать в этом случае мы у него сможем только те методы, которые есть в интерфейсе. Но иногда этого более чем достаточно!
3) Интерфейсы позволяют реализовывать инверсию зависимостей. Если вы разобрались в первых двух пунктах, но не разобрались в этом — у вас все хорошо, вернитесь перечитать статью через полгода.
Суть интерфейсов
1. Способности
Чтобы лучше понять преимущества интерфейсов и места их использования, нужно поговорить о более абстрактных вещах.
Класс — это, чаще всего модель какого-то конкретного объекта. Интерфейс же больше соответствует не объектам, а их способностям или ролям.
Например, такие вещи, как машина, велосипед, мотоцикл и колесо лучше всего представить в виде классов и объектов. А такие их способности, как «могу ездить», «могу перевозить людей», «могу стоять», лучше представить в виде интерфейсов. Вот несколько примеров:
Код | Описание |
---|---|
соответствует способности передвигаться | |
соответствует способности управляться водителем | |
соответствует способности перевозить грузы | |
класс Wheel (колесо) обладает способностью передвигаться | |
класс Car (машина) обладает способностью передвигаться, управляться человеком и перевозить грузы | |
класс Skateboard (скейтборд) обладает способностью передвигаться и управляться человеком |
2. Роли
Интерфейсы сильно упрощают жизнь программиста. Очень часто в программе есть тысячи объектов, сотни классов и всего пара десятков интерфейсов — ролей. Ролей мало, а их комбинаций — классов — очень много.
Весь смысл в том, что вам не нужно писать код для взаимодействия всех классов со всеми. Вам достаточно взаимодействовать с их ролями (интерфейсами).
Представьте, что вы дрессируете домашних животных, каждое из которых может иметь несколько разных способностей. И вы поспорили с соседом, чьи животные громче кричат. Вы просто берете всех, у которых есть способность «голос», и командуйте им: Голос!.
Вам все равно, что это за животные и какие у них есть другие способности. Хоть тройное сальто назад. В этот конкретный момент вас интересует только способность громко орать. Вот как это выглядело бы в коде:
Для удобства мы дали классам имена на русском. Такое допускается в Java, но крайне нежелательно.
Наша Рыбка не обладает способностью говорить (не реализует интерфейс Звучание ).
Когда количество классов в ваших программах пойдет на тысячи, вы жить без интерфейсов не сможете. Вместо описания взаимодействия тысяч классов, достаточно описать взаимодействие десятков интерфейсов — это очень сильно упрощает жизнь.
3. default реализация в методах интерфейсов
Абстрактные классы могут иметь переменные и реализацию методов, но для них множественное наследование запрещено. Интерфейсы не могут иметь переменные и реализации методов, и для них множественное наследование разрешено.
Можно эту ситуацию выразить в таблице:
Способность | Абстрактные классы | Интерфейсы |
---|---|---|
Переменные | ✔ | ✖ |
Реализация методов | ✔ | ✖ |
Множественное наследование | ✖ | ✔ |
И вот некоторым программистам очень хотелось, чтобы у интерфейсов была возможность иметь реализацию методов. Иметь возможность добавить реализацию метода — это же не значит, что ее всегда обязательно будут добавлять. Хочешь добавляй, хочешь — нет.
К тому же, проблемы с множественным наследованием в первую очередь из-за переменных. В общем, решили и сделали. Начиная с JDK 8, в Java появилась возможность добавлять в интерфейсы методы с реализацией.
Новая актуальная таблица (для JDK 8 и выше):
Способность | Абстрактные классы | Интерфейсы |
---|---|---|
Переменные | ✔ | ✖ |
Реализация методов | ✔ | ✔ |
Множественное наследование | ✖ | ✔ |
Теперь и в абстрактных классах, и в интерфейсах можно объявлять как методы с реализацией, так и без нее. И это отличная новость!
Для простоты приведем эту информацию в виде небольшой таблички:
Способность | Абстрактные классы | Интерфейсы |
---|---|---|
Методы без реализации | abstract | – |
Методы с реализацией | – | default |
Проблема
С помощью интерфейсов с методами можно значительно упростить иерархии многих классов. Например, абстрактные классы InputStream и OutputStream можно объявить интерфейсами! Это позволит использовать их гораздо чаще и гораздо удобнее.
Но в мире уже написаны десятки миллионов (миллиарды?) Java-классов. И если начать менять стандартные библиотеки, то есть риск, что что-то может поломаться. Например, всё! 😛
Чтобы случайно не сломать работающие программы и библиотеки, было решено, что реализация методов в интерфейсах получит самый низкий приоритет при наследовании.
Например, если от интерфейса с методом унаследовать второй интерфейс и в нем объявить этот же метод, но без реализации, то реализация из первого метода до класса не дойдет. Пример: