В чем именно разница между интерфейсом и абстрактным классом?
oop
interface
abstract-class
Sarfraz
источник
источник
Ответы:
Интерфейсы
Интерфейс - это контракт : человек, пишущий интерфейс, говорит: « Эй, я принимаю вещи, выглядящие так », а человек, использующий интерфейс, говорит: « Хорошо, класс, который я пишу, выглядит так ».
Интерфейс - это пустая оболочка . Существуют только сигнатуры методов, что означает, что методы не имеют тела. Интерфейс не может ничего сделать. Это просто шаблон.
Например (псевдокод):
Реализация интерфейса потребляет очень мало ресурсов ЦП, потому что это не класс, а просто набор имен, и, следовательно, нет дорогого поиска. Это здорово, когда это важно, например, во встроенных устройствах.
Абстрактные классы
Абстрактные классы, в отличие от интерфейсов, являются классами. Они более дороги в использовании, потому что есть поиск, когда вы наследуете их.
Абстрактные классы очень похожи на интерфейсы, но у них есть нечто большее: вы можете определить поведение для них. Это больше о человеке, который говорит: « Эти классы должны выглядеть так, и у них есть это общее, так что заполняйте пробелы! ».
Например:
Реализация
В то время как абстрактные классы и интерфейсы должны быть разными понятиями, реализации иногда делают это утверждение неверным. Иногда они даже не такие, как вы думаете.
В Java это правило строго соблюдается, в то время как в PHP интерфейсы являются абстрактными классами без объявленного метода.
В Python абстрактные классы - это скорее уловка программирования, которую вы можете получить из модуля ABC, и фактически она использует метаклассы и, следовательно, классы. А интерфейсы в большей степени связаны с типизацией утки на этом языке, и это смесь соглашений и специальных методов, вызывающих дескрипторы (методы __method__).
Как обычно в программировании, есть теория, практика и практика на другом языке :-)
источник
interface
иclass
изHead First Java
ярко, чтоA class defines who you are, and an interface tells what roles you could play
Основные технические различия между абстрактным классом и интерфейсом :
Абстрактные классы могут иметь константы, члены, заглушки методов (методы без тела) и определенные методы , тогда как интерфейсы могут иметь только константы и заглушки методов .
Методы и члены абстрактного класса могут быть определены с любой видимостью , тогда как все методы интерфейса должны быть определены как
public
(они определены как общедоступные по умолчанию).При наследовании абстрактного класса конкретный дочерний класс должен определять абстрактные методы , тогда как абстрактный класс может расширять другой абстрактный класс, и абстрактные методы из родительского класса не должны быть определены.
Аналогично, интерфейс, расширяющий другой интерфейс, не отвечает за реализацию методов из родительского интерфейса. Это потому, что интерфейсы не могут определять любую реализацию.
Дочерний класс может расширять только один класс (абстрактный или конкретный), тогда как интерфейс может расширяться или класс может реализовывать несколько других интерфейсов .
Дочерний класс может определять абстрактные методы с такой же или менее ограниченной видимостью , тогда как класс, реализующий интерфейс, должен определять методы с точно такой же видимостью (public).
источник
CANNOT
создаются.Интерфейс содержит только определение / сигнатуру функциональности, и если у нас есть некоторые общие функциональные возможности, а также общие сигнатуры, то нам нужно использовать абстрактный класс. Используя абстрактный класс, мы можем обеспечить как поведение, так и функциональность одновременно. Другой разработчик, унаследовавший абстрактный класс, может легко использовать эту функциональность, поскольку им нужно будет только заполнить пробелы.
Взято из:
http://www.dotnetbull.com/2011/11/difference-between-abstract-class-and.html
http://www.dotnetbull.com/2011/11/what-is-abstract-class-in-c-net.html http://www.dotnetbull.com/2011/11/what-is-interface-in -с-net.html
источник
Объяснение можно найти здесь: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm
Во всяком случае, я нахожу это объяснение интерфейсов несколько запутанным. Более распространенное определение: интерфейс определяет контракт, который должны выполнять реализующие классы. Определение интерфейса состоит из подписей открытых членов, без какого-либо кода реализации.
источник
Я не хочу выделять различия, о которых уже говорилось во многих ответах (относительно открытых статических модификаторов final для переменных в интерфейсе и поддержки защищенных, закрытых методов в абстрактных классах)
Проще говоря, я хотел бы сказать:
интерфейс: для реализации контракта несколькими несвязанными объектами
абстрактный класс: для реализации одинакового или разного поведения среди нескольких связанных объектов
Из документации Oracle
Рассмотрите возможность использования абстрактных классов, если:
Рассмотрите возможность использования интерфейсов, если:
Serializable
интерфейс.абстрактный класс устанавливает связь «есть» с конкретными классами. Интерфейс предоставляет возможность «имеет» для классов.
Если вы ищете в
Java
качестве языка программирования, вот еще несколько обновлений:Java 8 в некоторой степени сократила разрыв между классами
interface
иabstract
классами, предоставив функциюdefault
метода. Интерфейс не имеет реализации для метода , более не действителен в настоящее время.Обратитесь к этой странице документации для получения более подробной информации.
Посмотрите на этот вопрос SE для примеров кода, чтобы лучше понять.
Как мне объяснить разницу между интерфейсом и абстрактным классом?
источник
Некоторые важные отличия:
В форме таблицы:
Как заявил Джо из javapapers :
источник
Суть в том, что:
источник
Если вы хотите обеспечить полиморфное поведение в иерархии наследования, используйте абстрактные классы.
Если вы хотите полиморфное поведение для классов, которые совершенно не связаны, используйте интерфейс.
источник
Я строю здание из 300 этажей
План здания интерфейс
Здание построено до 200 этажей - частично завершено --- аннотация
Строительство здания завершено- бетон
Интерфейс
Аннотация
Взято с сайта DurgaJobs
источник
Давайте снова поработаем над этим вопросом:
Первое, что вам нужно знать, это то, что 1/1 и 1 * 1 дают одинаковые результаты, но это не означает, что умножение и деление одинаковы. Очевидно, у них хорошие отношения, но учтите, что вы оба разные.
Я укажу основные отличия, а остальное уже объяснили:
Абстрактные классы полезны для моделирования иерархии классов. На первый взгляд из любого требования мы частично понимаем, что именно должно быть построено, но мы знаем, что строить. И поэтому ваши абстрактные классы являются вашими базовыми классами.
Интерфейсы полезны для того, чтобы другие иерархии или классы знали, на что я способен. И когда вы говорите, что я способен на что-то, вы должны иметь эту способность. Интерфейсы пометят его как обязательный для класса для реализации тех же функций.
источник
Это довольно просто на самом деле.
Вы можете думать об интерфейсе как о классе, которому разрешено иметь только абстрактные методы и ничего больше.
Таким образом, интерфейс может только «объявлять» и не определять поведение, которое должен иметь класс.
Абстрактный класс позволяет вам как объявлять (используя абстрактные методы), так и определять (используя полные реализации методов) поведение, которое должен иметь класс.
А обычный класс позволяет вам только определять, а не объявлять поведение / действия, которые должен иметь класс.
Одна последняя вещь,
В Java вы можете реализовать несколько интерфейсов, но вы можете расширить только один (абстрактный класс или класс) ...
Это означает, что наследование определенного поведения ограничено, чтобы разрешить только одно на класс ... то есть, если вы хотели, чтобы класс, инкапсулирующий поведение из классов A, B и C, вам нужно было бы сделать следующее: класс A расширяет B, класс C расширяет A .. Немного о способе иметь множественное наследование ...
Интерфейсы с другой стороны, вы могли бы просто сделать: интерфейс C реализует A, B
Таким образом, в действительности Java поддерживает множественное наследование только в «объявленном поведении», то есть в интерфейсах, и только в единственном наследовании с определенным поведением ... если только вы не выполните описанный мной способ ...
Надеюсь, это имеет смысл.
источник
Сравнение интерфейса и абстрактного класса неверно. Вместо этого должно быть два других сравнения: 1) интерфейс против класса и 2) абстрактный против финального класса .
Интерфейс против Класса
Интерфейс - это контракт между двумя объектами. Например, я почтальон, а ты посылка для доставки. Я ожидаю, что вы знаете свой адрес доставки. Когда кто-то дает мне посылку, он должен знать ее адрес доставки:
Класс - это группа объектов, которые подчиняются договору. Например, я ящик из группы «Ящик» и подчиняюсь договору, требуемому Почтальоном. В то же время я подчиняюсь другим контрактам:
Аннотация против Финал
Абстрактный класс - это группа незавершенных объектов. Их нельзя использовать, потому что они пропускают некоторые части. Например, я - абстрактная коробка с поддержкой GPS - я знаю, как проверить свое положение на карте:
Этот класс, если он унаследован / расширен другим классом, может быть очень полезным. Но само по себе - это бесполезно, так как не может иметь объектов. Абстрактные классы могут быть элементами построения конечных классов.
Финальный класс - это группа законченных объектов, которые можно использовать, но нельзя изменить. Они точно знают, как работать и что делать. Например, я ящик, который всегда идет по адресу, указанному при его создании:
В большинстве языков, таких как Java или C ++, возможно иметь только класс , ни абстрактный, ни окончательный. Такой класс может быть унаследован и может быть создан. Я не думаю, что это строго соответствует объектно-ориентированной парадигме.
Опять же, сравнение интерфейсов с абстрактными классами не является правильным.
источник
Вкратце различия следующие:
Синтаксические различия между интерфейсом и абстрактным классом :
В интерфейсах сейчас:
public static
- поддерживаетсяpublic abstract
- поддерживаетсяpublic default
- поддерживаетсяprivate static
- поддерживаетсяprivate abstract
- ошибкаprivate default
компиляцииprivate
- ошибка компиляции - поддерживаетсяисточник
Разница лишь в том, что один может участвовать в множественном наследовании, а другой - нет.
Определение интерфейса со временем изменилось. Как вы думаете, интерфейс имеет только объявления методов и является просто контрактами? А как насчет статических конечных переменных и определения по умолчанию после Java 8?
Интерфейсы были введены в Java из-за проблемы с множественным наследованием алмазов, и именно это они и намерены делать.
Интерфейсы - это конструкции, созданные для решения проблемы множественного наследования, и могут иметь абстрактные методы, определения по умолчанию и статические конечные переменные.
См. Почему Java допускает статические конечные переменные в интерфейсах, когда они предназначены только для контрактов? ,
источник
Интерфейс: поверните (поверните налево, поверните направо)
Абстрактный класс: Колесо.
Класс: рулевое колесо, происходит от колеса, выставляет интерфейс поворота
Один предназначен для категоризации поведения, которое может быть предложено в широком диапазоне вещей, другой - для моделирования онтологии вещей.
источник
Если у вас есть общие методы, которые могут использоваться несколькими классами, переходите к абстрактным классам. Иначе, если вы хотите, чтобы классы следовали определенной схеме, используйте интерфейсы.
Следующие примеры демонстрируют это.
Абстрактный класс в Java:
Ниже приведена реализация интерфейса в Java:
Несколько важных ключевых моментов в двух словах:
Переменные, объявленные в интерфейсе Java, по умолчанию являются окончательными. Абстрактные классы могут иметь не конечные переменные.
Переменные, объявленные в интерфейсе Java, по умолчанию являются статическими. Абстрактные классы могут иметь нестатические переменные.
Члены интерфейса Java являются общедоступными по умолчанию. Абстрактный класс Java может иметь обычные разновидности членов класса, такие как private, protected и т. Д.
источник
Многие младшие разработчики ошибочно считают интерфейсы, абстрактные и конкретные классы незначительными вариациями одного и того же и выбирают один из них исключительно по техническим причинам: нужно ли множественное наследование? Нужно ли какое-то место, чтобы поставить общие методы? Нужно ли беспокоиться о чем-то другом, кроме как о конкретном занятии? Это неправильно, и в этих вопросах скрыта главная проблема: «Я» . Когда вы пишете код для себя, вы редко думаете о других настоящих или будущих разработчиках, работающих над вашим кодом или над ним.
Интерфейсы и абстрактные классы, хотя и кажутся с технической точки зрения схожими, имеют совершенно разные значения и цели.
Резюме
Интерфейс определяет контракт, который некоторая реализация выполнит для вас .
Абстрактный класс обеспечивает поведение по умолчанию, которое ваша реализация может использовать повторно.
Альтернативное резюме
О важности сокрытия деталей реализации
Конкретный класс выполняет реальную работу очень специфическим способом. Например, оператор
ArrayList
использует непрерывную область памяти для компактного хранения списка объектов, который предлагает быстрый произвольный доступ, итерации и изменения на месте, но ужасен при вставках, удалениях и иногда даже добавлениях; между темLinkedList
использует двойные узлы для хранения списка объектов, который вместо этого предлагает быструю итерацию, изменения на месте и вставку / удаление / добавление, но ужасен при произвольном доступе. Эти два типа списков оптимизированы для разных вариантов использования, и очень важно, как вы собираетесь их использовать. Когда вы пытаетесь выжать производительность из списка, с которым интенсивно взаимодействуете, и когда выбор типа списка зависит от вас, вы должны тщательно выбрать, какой экземпляр вы создаете.С другой стороны, пользователям высокого уровня списка на самом деле все равно, как он на самом деле реализован, и они должны быть изолированы от этих деталей. Давайте представим, что Java не предоставляла
List
интерфейс, а имела только конкретныйList
класс, который на самом делеLinkedList
и сейчас. Все Java-разработчики приспособили бы свой код к деталям реализации: избегайте произвольного доступа, добавьте кеш для ускорения доступа или просто переопределитеArrayList
его самостоятельно, хотя это было бы несовместимо со всем другим кодом, который фактически работает сList
только с. Это было бы ужасно ... Но теперь представьте, что мастера Java на самом деле понимают, что связанный список ужасен для большинства реальных случаев использования, и решили переключиться на список массивов только для своих целей.List
класс доступен. Это повлияет на производительность каждой Java-программы в мире, и люди не будут этому рады. И главный виновник в том, что детали реализации были доступны, и разработчики предположили, что эти детали являются постоянным контрактом, на который они могут положиться. Вот почему важно скрывать детали реализации и определять только абстрактный контракт. Это цель интерфейса: определить, какие входные данные принимает метод и какой ожидаемый результат, не подвергая всех смелости, которая побудит программистов настроить свой код, чтобы соответствовать внутренним деталям, которые могут измениться при любом будущем обновлении ,Абстрактный класс находится посередине между интерфейсами и конкретными классами. Предполагается, что реализации помогают использовать общий или скучный код. Например,
AbstractCollection
предоставляет базовые реализации дляisEmpty
основанного на размере 0,contains
как итерацию и сравнение,addAll
как повторениеadd
, и так далее. Это позволяет реализациям сосредоточиться на важнейших частях, которые различают их: как на самом деле хранить и извлекать данные.API против SPI
Интерфейсы являются шлюзами с низкой когезией между различными частями кода. Они позволяют библиотекам существовать и развиваться, не нарушая каждый пользователь библиотеки, когда что-то меняется внутри. Он называется интерфейсом прикладного программирования , а не классами прикладного программирования. В меньшем масштабе они также позволяют нескольким разработчикам успешно сотрудничать в крупномасштабных проектах, разделяя различные модули через хорошо документированные интерфейсы.
Абстрактные классы - это помощники с высокой степенью сцепления, которые используются при реализации интерфейса, предполагая некоторый уровень детализации реализации. В качестве альтернативы, абстрактные классы используются для определения SPI, интерфейсов поставщиков услуг.
Разница между API и SPI невелика, но важна: для API основное внимание уделяется тому, кто его использует , а для SPI - тому, кто его реализует .
Добавить методы в API легко, все существующие пользователи API все равно будут компилировать. Добавить методы в SPI сложно, поскольку каждый поставщик услуг (конкретная реализация) должен будет реализовать новые методы. Если для определения SPI используются интерфейсы, поставщик должен будет выпускать новую версию при каждом изменении контракта SPI. Если вместо этого используются абстрактные классы, новые методы могут быть определены либо в терминах существующих абстрактных методов, либо в виде пустых
throw not implemented exception
заглушек, что по крайней мере позволит более старой версии реализации службы по-прежнему компилироваться и запускаться.Замечание о Java 8 и методах по умолчанию
Хотя в Java 8 были введены методы по умолчанию для интерфейсов, что делает грань между интерфейсами и абстрактными классами еще более размытой, это было сделано не для того, чтобы реализации могли повторно использовать код, а для того, чтобы упростить изменение интерфейсов, которые служат как API, так и SPI. (или неправильно используются для определения SPI вместо абстрактных классов).
Какой использовать?
Следствие: обратное часто делается неправильно: при использовании вещи всегда старайтесь использовать самый универсальный класс / интерфейс, который вам действительно нужен. Другими словами, не объявляйте ваши переменные как
ArrayList theList = new ArrayList()
, если только у вас на самом деле нет сильной зависимости от того, что он является списком массивов , и никакой другой тип списка не подрезал бы его для вас. ИспользуйтеList theList = new ArrayList
вместо этого, или дажеCollection theCollection = new ArrayList
если факт, что это список, а не какой-либо другой тип коллекции, на самом деле не имеет значения.источник
На самом деле это не ответ на первоначальный вопрос, но как только вы получите ответ на различие между ними, вы введете дилемму «когда использовать каждый»: когда использовать интерфейсы или абстрактные классы? Когда использовать оба?
Я ограничил знание ООП, но видение интерфейсов как эквивалента прилагательного в грамматике до сих пор работало для меня (поправьте меня, если этот метод фальшивый!). Например, имена интерфейсов похожи на атрибуты или возможности, которые вы можете дать классу, и у класса может быть много из них: ISerializable, ICountable, IList, ICacheable, IHappy, ...
источник
Наследование используется для двух целей:
Позволить объекту рассматривать элементы данных родительского типа и реализации методов как свои собственные.
Разрешить использование ссылки на объекты одного типа кодом, который ожидает ссылку на объект супертипа.
В языках / средах, которые поддерживают обобщенное множественное наследование, часто нет необходимости классифицировать тип как «интерфейс» или «абстрактный класс». Однако популярные языки и структуры позволят типу рассматривать элементы данных или реализации методов другого типа как свои собственные, даже если они позволяют типу заменять произвольное число других типов.
Абстрактные классы могут иметь члены данных и реализации методов, но могут наследоваться только классами, которые не наследуются от каких-либо других классов. Интерфейсы почти не накладывают ограничений на типы, которые их реализуют, но не могут включать в себя какие-либо элементы данных или реализации методов.
Есть моменты, когда полезно, чтобы типы заменяли многие разные вещи; бывают и другие случаи, когда объектам полезно рассматривать элементы данных родительского типа и реализации методов как свои собственные. Проведение различия между интерфейсами и абстрактными классами позволяет использовать каждую из этих способностей в тех случаях, когда она наиболее актуальна.
источник
Ключевые моменты:
Преимущество:
подробности смотрите здесь ... http://pradeepatkari.wordpress.com/2014/11/20/interface-and-abstract-class-in-c-oops/
источник
Кратчайший способ подвести итог - это
interface
:default
иstatic
методов; хотя у него есть определения (сигнатуры методов + реализации) дляdefault
иstatic
методов, у него есть только объявления (сигнатуры методов) для других методов.interface
s иinterface
может наследовать от несколькихinterface
s). Все переменные неявно постоянны, независимо от того, указаны ониpublic static final
или нет. Все члены неявноpublic
, независимо от того, указаны ли они как таковые или нет.Между тем,
abstract
класс это:abstract
методов. Может содержать как объявления, так и определения, причем объявления помечаются какabstract
.protected
,private
или частный пакет (не указан).Или, если мы хотим свести все это к одному предложению: An
interface
- это то, что имеет реализующий класс , ноabstract
класс - это то, что подкласс является .источник
Я хотел бы добавить еще одно отличие, которое имеет смысл. Например, у вас есть фреймворк с тысячами строк кода. Теперь, если вы хотите добавить новую функцию в код, используя метод EnhifyUI (), то лучше добавить этот метод в абстрактный класс, а не в интерфейс. Потому что, если вы добавляете этот метод в интерфейс, вы должны реализовать его во всех реализованных классах, но это не тот случай, если вы добавляете метод в абстрактный класс.
источник
Чтобы дать простой, но ясный ответ, это помогает установить контекст: вы используете оба, когда вы не хотите предоставлять полные реализации.
Основное отличие состоит в том, что интерфейс вообще не имеет реализации (только методы без тела), в то время как абстрактные классы также могут иметь члены и методы с телом, то есть могут быть частично реализованы.
источник
default
ключевое слово в Java 8, с помощью которого вы также можете определять конкретные методы в интерфейсах.Различия между абстрактным классом и интерфейсом от имени реальной реализации.
Интерфейс : Это ключевое слово, и оно используется для определения шаблона или чертежа объекта, и оно заставляет все подклассы следовать одному и тому же прототипу, так как для реализации все подклассы свободны для реализации функциональности согласно это требование.
Некоторые из других случаев использования, где мы должны использовать интерфейс.
Связь между двумя внешними объектами (сторонняя интеграция в нашем приложении) осуществляется через интерфейс здесь интерфейс работает как контракт.
Абстрактный класс: абстрактный, это ключевое слово, и когда мы используем это ключевое слово перед любым классом, оно становится абстрактным классом. Он используется главным образом, когда нам нужно определить шаблон, а также некоторые функциональные возможности по умолчанию для объекта, за которым следуют все подклассы и таким образом он удаляет избыточный код и еще один случай использования, когда мы можем использовать абстрактный класс , например, если мы не хотим, чтобы другие классы могли напрямую создавать экземпляр объекта класса, только функциональные возможности могут использовать только производные классы.
Пример абстрактного класса:
Пример интерфейса:
источник
Вы можете найти четкую разницу между интерфейсом и абстрактным классом.
Интерфейс
Абстрактный класс
Абстрактный класс содержит абстрактные и неабстрактные методы.
Не заставляет пользователей реализовывать все методы при наследовании абстрактного класса.
Содержит все виды переменных, включая примитивные и не примитивные
Объявите, используя абстрактное ключевое слово.
Методы и члены абстрактного класса могут быть определены с любой видимостью.
Дочерний класс может расширять только один класс (абстрактный или конкретный).
источник
Абстрактный класс - это класс, объект которого не может быть создан, или класс, который не может быть создан. Абстрактный метод делает класс абстрактным. Абстрактный класс должен быть унаследован, чтобы переопределить методы, объявленные в абстрактном классе. Нет ограничений на спецификаторы доступа. Абстрактный класс может содержать конструктор и другие конкретные (не abstarct методы) методы, но интерфейс не может иметь.
Интерфейс является планом / шаблоном методов (например, дом на бумаге предоставляется (интерфейсный дом), и различные архитекторы будут использовать свои идеи для его создания (классы архитекторов, реализующих интерфейс дома). Это коллекция абстрактные методы, методы по умолчанию, статические методы, конечные переменные и вложенные классы. Все члены будут либо финальными, либо открытыми, спецификаторы защищенного и закрытого доступа не допускаются. Создание объекта не допускается. Необходимо создать класс, чтобы использовать реализации интерфейса, а также для переопределения абстрактного метода, объявленного в интерфейсе. Интерфейс является хорошим примером слабой связи (динамический полиморфизм / динамическое связывание). Интерфейс реализует полиморфизм и абстракцию. Он говорит, что делать, но как делать, определяется реализующий класс. Например.Это автомобильная компания, и она хочет, чтобы некоторые функции были одинаковыми для всех автомобилей, которые она выпускает, поэтому компания будет производить интерфейсное транспортное средство, которое будет иметь эти функции и различные классы автомобилей (такие как Maruti Suzkhi, Maruti 800) будут переопределены эти функции (функции).
Почему интерфейс, когда у нас уже есть абстрактный класс? Java поддерживает только многоуровневое и иерархическое наследование, но с помощью интерфейса мы можем реализовать множественное наследование.
источник
В терминах практичности (JAVA) основное различие между абстрактным классом и интерфейсом состоит в том, что абстрактный класс может содержать состояние. Кроме состояния удержания мы можем выполнять операции покоя и с интерфейсом.
источник
В интерфейсе все методы должны быть только определениями, ни один не должен быть реализован.
Но в абстрактном классе должен существовать абстрактный метод только с определением, но другие методы также могут быть в абстрактном классе с реализацией ...
источник
У нас есть различные структурные / синтаксические различия между интерфейсом и абстрактным классом. Еще некоторые отличия
[1] Разница на основе сценария :
Абстрактные классы используются в сценариях, когда мы хотим ограничить пользователя в создании объекта родительского класса И мы верим, что в будущем будет добавлено больше абстрактных методов.
Интерфейс должен использоваться, когда мы уверены, что больше не может быть предоставлен более абстрактный метод. Тогда только интерфейс публикуется.
[2] Концептуальная разница :
«Нужно ли нам предоставлять больше абстрактных методов в будущем», если ДА сделает его абстрактным классом, и если НЕТ, то сделает его Интерфейсом.
(Наиболее подходящий и действительный до Java 1.7)
источник
обычно абстрактный класс используется для ядра чего-то, но интерфейс используется для добавления периферийных устройств.
когда вы хотите создать базовый тип для транспортного средства, вы должны использовать абстрактный класс, но если вы хотите добавить некоторую функциональность или свойство, которое не является частью базовой концепции транспортного средства, вы должны использовать интерфейс, например, вы хотите добавить функцию «ToJSON ()» ,
Интерфейс имеет широкий спектр абстракций, а не абстрактный класс. Вы можете увидеть это в передаче аргументов. посмотрите этот пример:
если вы используете транспортное средство в качестве аргумента, вы можете просто использовать один из его производных типов (автобус или автомобиль той же категории - просто категория транспортного средства). но когда вы используете интерфейс IMoveable в качестве аргумента, у вас есть больше вариантов.
источник