Объясните по-простому, на пальцах, зачем и для чего нужны интерфейсы (Java)? Все эти заумные книжные определения и формулировки, ясности совсем не прибавляют.
Общее определение: Интерфейс это совокупность методов и правил взаимодействия элементов системы. Другими словами интерфейс определяет как элементы будут взаимодействовать между собой.
Когда вы используете эти "объекты" вы уверены в том что вы сможете использовать их подобным образом. Благодаря тому что вы знакомы с их интерфейсом
В программировании что-то похожее. Почему графическую часть программы часто называют интерфейсом? Потому, что она определяет каким образом вы сможете использовать основной функционал заложенный в программе.
"Интерфейс определяет каким образом мы можем использовать объект" - перенесем эту мысль в плоскость программирования.
Предположим у вас в программе есть следующие типы:
// несколько базовых интерфейсов, они пустые,
// т.к. их наполнение на данный момент не существенно
interface Rul {}
interface Pedal {}
interface Kpp {}
// интерфейс описывает взаимодействие с автомобилем - т.е. его интерфейс
// предоставляет другим объектам доступ к рулю и педалям
// (по сути этот интерфейс соответствует автомобилю с коробкой автоматом)
interface Car {
Rul getRul();
Pedal[] getPedali();
}
// этот интерфейс расширяет базовый
// и предоставляет доступ еще и к коробке передач
interface CarWithKPP extends Car {
Kpp getKpp();
}
// а здесь у нас сам автомобиль
// реализации методов опущены т.к. не существенно
class SomeCar implements CarWithKpp {...}
а сейчас посмотрим как можно пользоваться тем что у нас есть:
// создаем новый объект
SomeCar instance = new SomeCar();
// делаем какие-то действия над объектом
testAction1(instance);
testAction2(instance);
Как видите используем мы их одинаково, но суть кроется в реализации методов:
void testAction1(CarWithKpp c) {
c.getRul(); // можно
c.getPedali(); // можно
c.getKpp(); // можно
}
void testAction2(Car c) {
c.getRul(); // можно
c.getPedali(); // можно
c.getKpp(); // нельзя, ошибка компиляции. этот метод не определен в интерфейсе Car
}
С одной стороны тот факт, что SomeCar наследует интерфейс CarWithKpp (а посредством последнего еще и Car), позволяем нам использовать его для работы с методами testAction1, testAction2. Интерфейсы которые реализованы (имплементированы) в классе SomeCar — предоставляют доступ к правильному его использованию. А еще использование интерфейса в сигнатуре метода гарантирует, что вы получите именно тот тип, который вам нужен.
Обратная сторона медали состоит в том, что интерфейс накладывает ограничения на использование класса. Примером этому является то, что в методе testAction2 получить доступ к методу getKpp уже невозможно. Таким образом можно скрыть методы и свойства которые объявлены в интерфейсе CarWithKpp, а так же методы объявленные в классе SomeCar (если их нет в интерфейсе). Оба метода могут использовать только тот набор "средств", которые им доступны (это определяется интерфейсом).
По простому говорите? Ну ок, правда сейчас тут начнут плеваться всякие товарищи типо гуру :)
Интерфейс - это возможность взглянуть на класс как на объект немного другого типа.
Поясню: ну как бы название говорит за это. Объект в ООП это некая сущность имеющая свой набор методов и работы с ним - методы назовем условно "воротами", а интерфейс это "дверь" в этих "воротах" - немножко другой способ обращения с тем же самым объектом. Так что если забыть про "ворота" то это кажется другим объектом. Ключевое слово здесь кажется.
Пример: есть объект стол, у которого есть методы работы с ним: как то есть поесть сидя за ним, накрыть на нем хавчик, поставить, собрать, отпилить ножки и проч. Но этот же объект стол можно рассматривать как интерфейс мебель (на языке ООП это называется класс типа стол реализующий интерфейс типа мебель: class Table implements Furniture. Понятно, что не на всякой мебели можно поесть или отпилить ножку, но что уж точно так это то что мебель можно поставить и собрать.
Теперь для чего все это нужно. Опять же пример с мебелью - если скажем есть объект стул, который также реализует интерфейс мебель, то и со стулом и со столом можно обращаться одинаково - в этом и состоит смысл интерфейса - в унификации работы с разнотипными объектами.
P.S. Кстати, любимый вопрос интервьюеров на собеседовании: что имеет более высокий уровень абстракции - класс, абстрактный класс или интерфейс? Правильный ответ - интерфейс
Понимание интерфейсов придёт со временем. Сколько не читай, сколько не объясняй, Вы Сами должны понять ту гибкость, тот масштаб действий, которые они предоставляют программисту. Пытайтесь их использовать. Библиотека классов Java предоставляет интерфейсы для реализации. Попробуйте их изучить, возможно это поможет Вам уловить всю мощь которую предоставляет программирование с использованием интерфейсов.
Интерфейсом** объекта мы назовём набор операций (методов), которые он может совершать или которые можно совершать над ним. Например, интерфейс числа 3 называется, собственно, «Число» и включает в себя набор операций сложения, вычитания, умножения и деления. Реализовать этот интерфейс может любое количество типов/классов, например, типы ЦелоеЧисло, ВещественноеЧисло, КомплексноеЧисло, а также такие неочевидные типы как Интервал или Полином. В то же время, один и тот же тип может реализовать более чем один интерфейс. Так, ЦелоеЧисло кроме интерфейса Число может реализовать интерфейс Перечислимый – для этого в классе ЦелоеЧисло будет необходимо всего лишь доопределить операции «следующий» и «предыдущий».
http://habrahabr.ru/post/30444/
Анонс:
Вам может показаться странным, но это именно то, что отличает человека от животного — использование интерфейсов вместо классов. Вы наверняка помните классический опыт с обезьяной, которую приучили гасить огонь водой из ведёрка; а потом поставили ведёрко на плот посреди бассейна, но обезьяна всё равно бегала по мостику на плот и черпала воду из ведёрка, вместо того, чтобы черпать воду прямо из бассейна. То есть обезьянка использовала класс Вода-в-Ведёрке вместо интерфейса Вода (и даже больше, скажу по секрету: вместо интерфейса Средство-для-Тушения).
Когда мы мыслим классами — уподобляемся животным. Люди мыслят (и программируют) интерфейсами.
По-простому. Вопрос со множественным наследованием во многих языках программирования решается просто - либо разрешить, либо запретить. Джависты решили сесть на оба стула и выбрали свой, особый путь. Джава, в принципе, не умеет в множественное наследование классов. Если мы пишем ключевое слово extends, то мы знаем, что наследовать мы будем только один класс, будь он абстрактным или обычным. Но дабы упростить проектировку и обеспечение совместимости, плюшки от множественного наследования тоже хочется иметь, и тут на сцене появляются интерфейсы. Интерфейс - это список методов (только public(даже слово это писать не надо, в интерфейсе других быть не может), и только БЕЗ реализации) и переменных, которые обязательно, ну вот по любому есть в классе-потомке. И вот интерфейсов как раз через ключевое слово implements можно пихать сколько угодно. И друг от друга их наследовать можно. Таким образом, интерфейс - это гарантия того, что классы, реализующие его, содержат методы и переменные, в нем перечисленные. Потому, выражение ourObject instanseof ourInterface возвращает истину, мы точно знаем, что в ourObject есть методы, перечисленные в ourInterface
Интерфейсы являются основой взаимодействия всех современных информационных систем. Если интерфейс какого-либо объекта (персонального компьютера, программы, функции) не изменяется (стабилен, стандартизирован), это даёт возможность модифицировать сам объект, не перестраивая принципы его взаимодействия с другими объектами (так, например, научившись работать с одной программой под Windows, пользователь с легкостью освоит и другие — потому, что они имеют однотипные элементы интерфейса).
Пример с программами Windows очень понятен)) я сам сюда зашел чтобы понять что такое интерфейс
Set<String> set = new HashSet<String>();
set = new LinkedHashSet<String>();
set = new TreeSet<String>();
HashSet<String> newSet = new TreeSet<String>(); // - impossible
Интерфейс в java определяет интерфейс класса. Непонятно становится из-за несовершенности технического русского в программировании. Для более общего понимания нужно уяснить значения слова интерфейс.
Интерфейсы предназначены для поддержки динамического разрешения вызовов методов во время выполнения. Как правило, для нормального выполнения вызова метода из одного класса в другом оба класса должны присутствовать во время компиляции, чтобы компилятор Java мог проверить совместимость сигнатур методов. Само по себе это требование создает статическую и нерасширяемую среду распределения классов. В такой системе функциональные возможности неизбежно передаются вверх по иерархии классов, в результате чего механизмы будут становиться доступными все большему количеству подклассов. Интерфейсы предназначены для предотвращения этой проблемы. Они изолируют определение метода или набора методов от иерархии наследования. А поскольку иерархия интерфейсов не совпадает с иерархией классов, то классы, никак не связанные между собой иерархически , могут реализовать один и тот же интерфейс. Именно в этом возможности интерфейсов проявляются наиболее полно.
245 страница, глава 9 "пакеты и интерфейсы", Java 8 Полное руководство. Шилдт. 2015 г.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости