Для объектно-ориентированного программирования абстракция является одной из основных особенностей. В Java абстракция OOP может быть отражена в двух формах: интерфейсы и абстрактные классы. Слишком много сходств и слишком много различий между ними. Многие думают, что их можно использовать взаимозаменяемо, когда они являются начинающими, но на самом деле это не так. Сегодня мы узнаем о интерфейсах и абстрактных классах в Java. Вот контур каталогов этой статьи:
1. Аннотация класс
2. Интерфейс
3. Разница между абстрактными классами и интерфейсами
1. Аннотация класс
Прежде чем понимать абстрактные классы, давайте сначала поймем абстрактные методы. Абстрактный метод - это особый метод: он имеет только объявления, но нет конкретной реализации. Формат декларации абстрактного метода:
Abstract void Fun ();
Абстрактные методы должны быть изменены с помощью абстрактного ключевого слова. Если класс содержит абстрактные методы, этот класс называется абстрактным классом. Абстрактный класс должен быть изменен с помощью абстрактного ключевого слова перед классом. Поскольку абстрактные классы содержат методы без конкретных реализаций, объекты не могут быть созданы с использованием абстрактных классов.
Один из вопросов следует отметить ниже: в книге «Мысль о программировании Java», абстрактные классы определяются как «классы, содержащие абстрактные методы», но позже было обнаружено, что если класс не содержит абстрактных методов и просто модифицируется абстрактным, это также абстрактный класс. Другими словами, абстрактные классы не обязательно должны содержать абстрактные методы. Я лично думаю, что это упрямый вопрос, потому что, если абстрактный класс не содержит никаких абстрактных методов, почему он должен быть разработан как абстрактный класс? Так что помните эту концепцию на данный момент, и нет необходимости покопаться в том, почему.
[public] Abstract Class Classname {Abstract void Fun ();}Из этого мы видим, что абстрактные классы существуют для наследства. Если вы определите абстрактный класс, но не наследуете его, он эквивалентен созданию этого абстрактного класса напрасным, потому что вы не можете использовать его, чтобы что -либо сделать. Для родительского класса, если один из его методов реализован в родительском классе, не имеет значения и должен быть реализован по -разному в соответствии с фактическими потребностями подкласса, этот метод может быть объявлен как абстрактный метод, и этот класс становится абстрактным классом.
Классы, содержащие абстрактные методы, называются абстрактными классами, но они не означают, что абстрактные методы можно найти только в абстрактных классах. Как и обычные классы, они также могут иметь переменные -члены и обычные методы участников. Обратите внимание, что существует три основных различия между абстрактными классами и обычными классами:
1) Абстрактный метод должен быть публичным или защищенным (потому что, если он является частным, он не может быть унаследован подклассом, а подкласс не может реализовать метод). По умолчанию это публичное.
2) абстрактные классы не могут быть использованы для создания объектов;
3) Если класс наследует от абстрактного класса, подкласс должен реализовать абстрактный метод родительского класса. Если подкласс не реализует абстрактный метод родительского класса, подкласс также должен быть определен как абстрактный класс.
В других аспектах нет разницы между абстрактными классами и обычными классами.
2. Интерфейс
Интерфейс, называемый интерфейсом на английском языке, в разработке программного обеспечения, интерфейсы обычно относятся к методам или функциям для других. Исходя из этого, мы можем понять первоначальное намерение дизайнеров языка Java, что является абстракцией поведения. На Java форма интерфейса заключается в следующем:
[public] интерфейс InterfaceName {}
Интерфейсы могут содержать переменные и методы. Тем не менее, следует отметить, что переменные в интерфейсе будут неявно указаны как общедоступные статические конечные переменные (и могут быть только публичными статическими конечными переменными, а изменение частного будет сообщать об ошибке компиляции), в то время как методы будут неявно указаны как метод публичной абстракции и может быть только общедоступным абстрактным методом (с использованием других ключевых слов, таких как Private, Protected, STATIC, и т. Д. То есть методы в интерфейсе должны быть абстрактными методами. Отсюда мы можем смутно увидеть разницу между интерфейсом и абстрактным классом. Интерфейс является чрезвычайно абстрактным типом. Это больше «абстрактно», чем абстрактный класс и, как правило, не определяет переменные в интерфейсе.
Чтобы сделать класс, следуя конкретной группе интерфейсов, вам необходимо использовать ключевое слово реализации, конкретный формат заключается в следующем:
Class ClassName реализует интерфейс1, интерфейс2, [....] {}
Можно видеть, что класс может следовать нескольким конкретным интерфейсам. Если класс, не являющийся абстрактом, следует за интерфейсом, все методы в этом интерфейсе должны быть реализованы. Для абстрактных классов, которые следуют за интерфейсом, абстрактные методы в этом интерфейсе не могут быть реализованы.
3. Разница между абстрактными классами и интерфейсами
1. Различия на грамматическом уровне
1) абстрактные классы могут предоставить детали реализации методов участников, в то время как в интерфейсе могут существовать только публичные методы абстракции;
2) переменные элемента в абстрактных классах могут быть различных типов, в то время как переменные элемента в интерфейсе могут иметь только публичный статический конечный тип;
3) Интерфейс не может содержать статические кодовые блоки и статические методы, в то время как абстрактные классы могут иметь статические кодовые блоки и статические методы;
4) Класс может наследовать только один абстрактный класс, в то время как класс может реализовать несколько интерфейсов.
2. Различия на уровне дизайна
1) Абстрактные классы - это абстракции вещей, то есть абстракции классов, в то время как интерфейсы являются абстракциями поведения. Абстрактный класс абстрагирует весь класс, включая свойства и поведение, но интерфейс абстрагирует часть класса (поведение). Чтобы привести простой пример, самолеты и птицы - это разные вещи, но все они имеют одну общую черту, то есть все они летают. Затем при разработке самолет может быть спроектирован как самолет и характер, похожий на птицу, но характеристика полета не может быть спроектирована как класс. Следовательно, это просто поведенческая характеристика, а не абстрактное описание типа вещей. В настоящее время полет может быть спроектирован как интерфейсная муха, включая метод Fly (), а затем самолет и птица реализуют интерфейс мухи в соответствии с их собственными потребностями. Затем, как и для различных типов самолетов, таких как истребители, гражданские самолеты и т. Д., Это может непосредственно наследовать самолет. Это также похоже на птиц. Различные типы птиц могут непосредственно наследовать класс птиц. Отсюда мы видим, что наследство - это отношения «да или нет», в то время как реализация интерфейса - это отношения «да или нет». Если класс наследует абстрактный класс, подкласс должен быть типом абстрактного класса, а реализация интерфейса - это отношения, которая не существует, например, может ли птица летать (или имеет ли он характеристики полета). Если он может летать, он может реализовать этот интерфейс. Если он не может летать, это не осознает этот интерфейс.
2) Различные уровни дизайна, абстрактный класс - это шаблонный дизайн, как родительский класс многих подклассов. И интерфейс является кодом поведения, это радиационный дизайн. Что такое дизайн шаблона? Самый простой пример заключается в том, что все использовали шаблоны в PPT. Если вы используете шаблон A для проектирования PPT B и PPT C, общей частью PPT B и PPT C является шаблон A. Если их общедоступная часть необходимо изменить, вам нужно только изменять шаблон A, и нет необходимости повторно изменять PPT B и PPT C. То есть для абстрактных классов, если вам нужно добавить новые методы, вы можете напрямую добавить конкретные реализации в абстрактный класс, и подклассы не могут быть изменены; Но для интерфейсов это невозможно. Если интерфейс изменен, все классы, которые реализуют этот интерфейс, должны быть изменены соответствующим образом.
Давайте посмотрим на наиболее широко распространенный пример в Интернете: примеры дверей и сигналов тревоги: двери имеют два действия: open () и close (). В настоящее время мы можем определить эту абстрактную концепцию с помощью абстрактных классов и интерфейсов:
Abstract Class Door {public Abstract void Open (); Public Abstract void Close ();}или:
Дверь интерфейса {public rable void open (); Public Abstract void Close ();}Но теперь, если нам нужна дверь, чтобы выполнить функцию тревоги (), то как ее реализовать? Представлены следующие две идеи:
1) Поместите все три функции в абстрактный класс, но таким образом, все подклассы, унаследованные от этого абстрактного класса, имеют функции тревоги, но некоторые двери не обязательно имеют функции тревоги;
2) Поместите все эти три функции в интерфейс. Классы, которые должны использовать функции тревоги, должны реализовать Open () и Close () в этом интерфейсе. Возможно, этот класс не имеет двух функций Open () и Close () вообще, таких как пожарная сигнализация.
Отсюда мы можем видеть эту дверь Open (), Close () и тревога () просто принадлежат к двум поведениям в разных категориях. Open () и close () принадлежат к индивидуальным характеристикам поведения самих ворот, в то время как тревога () принадлежит расширенному дополнительному поведению. Следовательно, лучшее решение - разработать сигнал тревоги в качестве интерфейса, включая поведение тревоги (), и дверь в качестве отдельного абстрактного класса, включая открытое и близкое поведение. Еще один будильник предназначен для того, чтобы наследовать класс дверей и реализацию интерфейса тревоги.
Интерфейс Alram {void armer ();} абстрактный класс дверь {void open (); void clond ();} класс Calmistdoor Extends Door реализует тревори {void oepn () {// ..} void close () {// ..} void armer () {// ...}}Выше приведено сборник интерфейсов Java и абстрактных классов. Я надеюсь, что это может помочь друзьям, которые изучают Java -программирование.