2010-08-20 4 views
43

В Java для реализации множественного наследования мы используем интерфейсы. Это единственное использование интерфейсов? Если да, какое основное использование интерфейса в Java? Зачем нужны интерфейсы на Java?Зачем нужны интерфейсы в Java?

+2

возможно дубликат [Почему мы реализуем интерфейсы?] (http://stackoverflow.com/questions/1583654/why-we-are-implementing-interfaces) – Thilo

+0

Также хорошее объяснение [здесь] (http://programmers.stackexchange.com/a/ 131334/146150). –

ответ

40

Я бы сказал, что основное использование - это полиморфизм или способность выполнять одну и ту же операцию на нескольких разных объектах. Если разные объекты реализуют один и тот же интерфейс и имеют один и тот же метод, вы можете хранить все эти объекты в векторе, например, и перебирать вектор, вызывающий этот метод для каждого из них.

+2

Rob Я согласен с тобой, но я бы добавил, что, разделив концепцию реализации интерфейса из расширения класса (который фактически сталкивается в C++), вы можете иметь полиморфизм без множественного наследования – Sindico

5

Они вам нужны, чтобы вы могли вводить объекты вне иерархии.

Например, объекты, которые можно сравнить, могут быть в любом месте иерархии объектов - им не нужно иметь общий предок, который можно сравнить. String s можно сравнить, можно сравнить Integer s, вы можете даже сделать свой собственный Frame s, который можно сравнить (скажем, кадр «меньше», чем другой, если он больше на переднем плане, т. Е. Если он накладывает другой кадр). Таким образом, если вы хотите ссылаться на вещь, которую можно сравнить, вам придется объявить переменную с самым общим предком - в этом случае Object. Это слишком общее, потому что тогда оно также может получать значения, которые не сопоставимы (и будут вызывать ошибки при попытке сравнить их).

Таким образом, интерфейс Comparable: он выбирает все классы, которые реализуют функцию сравнения через иерархию подкласса-суперкласса.

13

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

Интерфейс позволяет представить соглашение между классами о том, как они будут разговаривать друг с другом, не привязавшись к фактическим реализациям.

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

-1

Некоторые коды не будут компилироваться без него.

Например, в:

for (String name : list) 
{ 
    System.out.print("\nIn foreach loop: name: " + name); 
} 

list должен реализовать java.lang.Iterable interface.

+5

Это по существу то же самое, что сказать, что вам нужно что-то использовать, потому что мы должен. Это не отвечает ** на вопрос. – rayryeng

+0

Я знаю это. Я просто указываю, что мы должны использовать их в этом случае, нравится нам это или нет. Я предпочитаю думать об этом как о аналогии с сборкой P.C .: Без какого-либо соответствия между аппаратными разъемами замена части, такой как блок питания или жесткий диск, была бы намного сложнее, если бы они не были взаимозаменяемыми. Если это не отвечает должным образом на вопрос, мне нравится думать, по крайней мере, это помогает людям понять, почему они полезны. –

27

Я также думал о том, как используются интерфейсы. Я надеюсь, что это поможет другим:

Интерфейс представляет собой контракт (или протокол, или общее понимание) того, что классы могут сделать. Когда класс реализует определенный интерфейс , он обещает предоставить реализацию всем абстрактным методам , объявленным в интерфейсе. Интерфейс определяет набор общих поведений. Классы реализуют интерфейс, соглашаясь с этими поведениями и обеспечивают собственную реализацию поведения. Этот позволяет запрограммировать интерфейс, а не фактическую реализацию . Одним из основных способов использования интерфейса является договор связи между двумя объектами.Если вы знаете, что класс реализует интерфейс, то вы знаете, что этот класс содержит конкретные реализации методов, объявленных в этом интерфейсе, и вы являетесь , которые гарантированно смогут безопасно использовать эти методы. Другими словами, два объекта могут связываться на основе контракта, определенного в интерфейсе , вместо их конкретной реализации.

Во-вторых, Java не поддерживает множественное наследование (тогда как C++ делает). Множественное наследование позволяет получить подкласс из более , чем один прямой суперкласс. Это создает проблему, если два прямых суперкласса имеют противоречивые реализации. (Какой из них следует в подкласса?). Однако множественное наследование действительно имеет свое место. Java делает это, позволяя вам «реализовать» более одного интерфейса (но вы можете «только расширять» только один суперкласс). Поскольку интерфейсы содержат только абстрактные методы без фактической реализации , конфликт между различными интерфейсами не возникает. (интерфейс может содержать константы, но не рекомендуется Если подкласс реализует два интерфейса с конфликтующими константами, воля флаг компилятора из ошибки компиляции..)

от: http://www.ntu.edu.sg/home/ehchua/programming/java/J3b_OOPInheritancePolymorphism.html#zz-6.6

+0

Является ли цель «сопоставимого интерфейса» в вашем ответе? – overexchange

Смежные вопросы