Содержание

Разница между абстрактным классом и интерфейсом (с таблицей) — узнайте любую разницу

By Администратор / 14 марта 2022

Как мы все знаем, абстракция относится к внутренней реализации функции и показывает пользователю ее практичность. то есть то, что он работает (показывая, однако, интерфейс предлагает полную абстракцию в Java, чего не могут сделать абстрактные категории.

Абстрактный класс против интерфейса

 Основное различие между абстрактным классом и интерфейсом заключается в том, что связанный интерфейс будет расширять исключительно другой интерфейс Java; связанная абстрактная категория разработает другую категорию Java и реализует несколько интерфейсов Java. Члены интерфейса Java по умолчанию отличаются от общедоступных. Абстрактная категория Java будет иметь элементы категории, такие как личные, защищенные и т. д.

Абстрактный класс — это класс, в объявлении которого есть ключевое слово abstract. В абстрактных классах должен присутствовать хотя бы один абстрактный метод, т. е. методы без тела. Он может иметь различные конкретные методы.

Вы можете использовать абстрактные классы для создания чертежей для конкретных классов. Однако абстрактный метод должен быть реализован наследующим классом.

Интерфейс — это план класса, который можно использовать для его создания. В интерфейсе нет конкретных методов (методов, которые имеют код). Все методы интерфейса являются абстрактными методами.

Невозможно создать интерфейс. С другой стороны, классы, реализующие интерфейсы, могут быть инстанцированы. Переменные экземпляра никогда не используются в интерфейсах, однако можно использовать общедоступные статические конечные переменные (также известные как константные переменные класса).

Что такое абстрактный класс?

Абстрактная категория определяется как категория, объявленная с помощью ключевого слова «abstract». Это группа общих характеристик таксономической группы, которые должны воплощать как минимум одну абстрактную технику. Ассоциированная абстрактная категория будет иметь несколько конкретных стратегий. Программисты, использующие Java XNUMX и более поздние версии, могут даже использовать стандартные и статические стратегии.

Абстракция может быть методом деятельности, детализирующей реализацию и демонстрирующей практичность исключительно пользователю.

Другой метод показывает пользователю только самое необходимое и скрывает детали интерьера, например, вызывая SMS везде, где вы пишете и отправляете сообщение. Вы не понимаете внутренний процесс доставки сообщений.

Абстракция позволяет вам специализироваться на том, что будет делать вещь, а не на том, что она будет делать.

Что такое интерфейс?

Интерфейс в Java может быть образцом категории. Это статические константы и абстрактные стратегии.

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

Другими словами, {вы будете| вы будете | вы сможете} сказать, что интерфейсы могут иметь абстрактные стратегии и переменные. У него не может быть тела пути.

Интерфейс Java совместно представляет отношение IS-A.

Таблица сравнения абстрактного класса и интерфейса

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

Основные различия между Абстрактный класс и интерфейс
  1. Тип стратегий: Интерфейс будет иметь исключительно абстрактные методы. ассоциированная абстрактная категория будет иметь абстрактные и неабстрактные стратегии. Начиная с Java XNUMX, он будет иметь стандартные и статические стратегии одновременно.
  2. Окончательные переменные: переменные, объявленные в области интерфейса Java, по умолчанию являются окончательными. ассоциированная абстрактная категория может содержать переменные, не являющиеся конечными.
  3. Тип переменных: Абстрактная категория будет иметь конечные, неконечные, статические и нестатические переменные. Интерфейс имеет только статические и конечные переменные.
  4. Реализация: Абстрактная категория даст реализацию интерфейса. Интерфейс не может предоставить реализацию связанной абстрактной категории.
  5. Наследование против абстракции: интерфейс Java может быть принудительно использован при использовании ключевого слова «реализует», связанного с абстрактной категорией, может быть расширен при использовании ключевого слова «расширяет».

Заключение

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

Справка

  1. https://dl.acm.org/doi/abs/10.1145/1040305.1040314
  2. https://books.google.com/books?hl=en&lr=&id=8M3F_sSSvWkC&oi=fnd&pg=PR13&dq=+interface+java&ots=Qo15Nih28i&sig=Y6OESYd5a6G709ynnLGB4Ry97yU

Интерфейсы — Kotlin

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

Интерфейс определяется ключевым словом interface.

interface MyInterface {
    fun bar()
    fun foo() {
      // необязательное тело
    }
}

Реализация интерфейсов

Класс или объект могут реализовать любое количество интерфейсов.

class Child : MyInterface {
    override fun bar() {
        // тело
    }
}

Свойства в интерфейсах

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

interface MyInterface {
    val prop: Int // абстрактное свойство
    val propertyWithImplementation: String
        get() = "foo"
    fun foo() {
        print(prop)
    }
}
class Child : MyInterface {
    override val prop: Int = 29
}

Наследование интерфейсов

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

Вполне естественно, что классы, реализующие такой интерфейс, требуются только для определения отсутствующих реализаций.

interface Named {
    val name: String
}
interface Person : Named {
    val firstName: String
    val lastName: String
    
    override val name: String get() = "$firstName $lastName"
}
data class Employee(
    // реализация 'name' не требуется
    override val firstName: String,
    override val lastName: String,
    val position: Position
) : Person

Устранение противоречий при переопределении

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

interface A {
    fun foo() { print("A") }
    fun bar()
}
interface B {
    fun foo() { print("B") }
    fun bar() { print("bar") }
}
class C : A {
    override fun bar() { print("bar") }
}
class D : A, B {
    override fun foo() {
        super<A>.foo()
        super<B>.foo()
    }
    
    override fun bar() {
        super<B>. bar()
    }
}

Оба интерфейса A и B объявляют функции

foo() и bar(). Оба реализуют foo(), но только B содержит реализацию bar() (bar() не отмечен как абстрактный метод в интерфейсе A, потому что в интерфейсах это подразумевается по умолчанию, если у функции нет тела). Теперь, если вы унаследуете какой-нибудь класс C от интерфейса A, вам, очевидно, придётся переопределять метод bar(), обеспечивая его реализацию.

Однако если вы унаследуете класс D от интерфейсов A и B, вам надо будет переопределять все методы, унаследованные от этих интерфейсов, и вам нужно указать, как именно D должен их реализовать. Это правило касается как тех методов, у которых имеется только одна реализация (

bar()), так и тех, у которых есть несколько реализаций (foo()).

В чем разница между интерфейсом и абстрактным классом? | Юйцзянь Тан | Простое программное обеспечение

В чем разница между интерфейсом и абстрактным классом? | Юйцзянь Тан | Обычная простая программа | Medium

Объектно-ориентированное программирование

Интерфейсы и абстрактные классы для объектно-ориентированного программирования

Опубликовано в

·

6 мин чтения

·

29 января 2022 г.

Изображение из Wikimedia

Когда я впервые начал программировать, у меня не было даже не слышал об интерфейсах, а тем более об абстрактных классах. Тем не менее, одна из первых вещей, которую вы должны сделать в качестве младшего инженера-программиста или…

Автор Yujian Tang

2,1 тыс. подписчиков

·Редактор

Бывший инженер FAANG. Основатель https://pythonalgos.com. Организатор на ai-educators.org. Baller

Еще от Yujian Tang и Plain Simple Software

Yujian Tang

в

Постоянное векторное хранилище для LlamaIndex

Откройте для себя преимущества постоянного векторного хранилища и оптимизируйте стратегию хранения данных.

Чтение: 4 мин·2 июня

Yujian Tang

in

Создание API с управлением пользователями с помощью FastAPI и Firebase

Краткое руководство по созданию API с пользователем аутентификация

·12 мин. read·13 декабря 2022 г.

Yujian Tang

in

23 Библиотеки искусственного интеллекта с открытым исходным кодом на 2023 г.

23 библиотеки искусственного интеллекта с открытым исходным кодом, отсортированные по популярности на GitHub

2 минуты чтения · 12 мая hain

Вы когда-нибудь видели эмодзи попугай + цепь? вокруг ИИ в последнее время? Это фирменные смайлики LangChain. LangChain — это инструмент агента ИИ…

·Чтение через 6 мин·4 июня

Просмотреть все от Yujian Tang

Рекомендовано от Medium

Love Sharma

в

Схема проектирования системы: Полное руководство

Разработка надежной, масштабируемой и эффективной системы может быть непростой задачей. Тем не менее, понимание ключевых концепций и компонентов может помочь…

· 9 минут чтения · 20 апреля

Джейкоб Беннетт

в

Используйте Git как старший инженер

Git — это мощный инструмент, который чувствует себя прекрасно использовать, когда вы знаете, как его использовать.

·Чтение через 4 мин·15 ноября 2022 г.

Списки

Как планировать карьеру, когда вы уже начали карьеру

10 этажей. Разговоры о карьере

7 историй·16 сохранений

Наш любимый совет по продуктивности

9 историй·9 сохранений

Дневники кодирования

в

Почему опытные программисты терпят неудачу на собеседовании по написанию кода с

Мой друг недавно присоединился к компании FAANG в качестве инженера-менеджера и оказался в положении найма для…

·5 минут чтения·2 ноября 2022 г.

Джон Рейнс

Стать инженером , а не Frameworker

Время повышать уровень.

·Чтение через 10 мин.·7 марта 2022 г.0043 Когда дело доходит до технологий, хорошая и плохая новость заключается в том, что у вас есть выбор. Если вы не очень хорошо разбираетесь в разработке программного обеспечения, это может…

·11 минут чтения·8 февраля

Энтони Д. Мэйс

Как практиковать задачи LeetCode (правильный путь)

tl;dr : Ты делаешь это неправильно. Используйте «Шесть шагов» каждый раз, когда тренируетесь с вопросами LeetCode, желательно с другим человеком. Следите за…

·13 мин чтения·10 мая 2022 г.

Посмотреть больше рекомендаций

Статус

Карьера

Преобразование текста в речь

Разница между абстрактным классом и интерфейсом в Java

Когда использовать интерфейс и абстрактный класс — один из самых популярных вопросов объектно-ориентированного проектирования, который почти всегда задают на собеседованиях по Java, C# и C++. В этой статье мы в основном будем говорить в контексте языка программирования Java, но это в равной степени относится и к другим языкам. Обычно вопрос начинается с различия между абстрактным классом и интерфейсом в Java, на который довольно легко ответить, особенно если вы знакомы с синтаксисом интерфейса Java и абстрактного класса. Все становится сложнее, когда интервьюер спрашивает, когда использовать абстрактный класс и интерфейс в Java, что в основном основано на твердом понимании популярных концепций ООП, таких как полиморфизм, инкапсуляция, абстракция, наследование и композиция.

Многие программисты здесь путаются, что естественно, потому что большинство из них не участвовали в реальном процессе проектирования системы и не видели влияния выбора того или иного.

Последствия дизайнерских решений лучше всего проявляются на этапе обслуживания, хороший дизайн обеспечивает плавную эволюцию, в то время как поддержание хрупкого дизайна является кошмаром.

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

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

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


Разница между абстрактным классом и интерфейсом в Java

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

1) Интерфейс в Java может содержать только объявление. Вы не можете объявлять какие-либо конкретные методы внутри интерфейса. С другой стороны, абстрактный класс может содержать как абстрактные, так и конкретные методы, что делает абстрактный класс идеальным местом для предоставления общих функций или функций по умолчанию. Я предлагаю прочитать мой пост 10 вещей, которые нужно знать об интерфейсе в Java, чтобы узнать больше об интерфейсах, особенно в языке программирования Java.

2) Интерфейс Java может расширять несколько интерфейсов, а класс Java может реализовывать несколько интерфейсов. Это означает, что интерфейс может обеспечить большую поддержку полиморфизма, чем абстрактный класс. Расширяя абстрактный класс, класс может участвовать только в одной иерархии типов, но с помощью интерфейса он может быть частью нескольких иерархий типов. Например. класс может быть Runnable и Displayable одновременно. Одним из примеров, который я могу вспомнить, является написание приложения с графическим интерфейсом на J2ME, где класс расширяет Canvas и реализует CommandListener для предоставления как графических функций, так и функций обработки событий..

3) Чтобы реализовать интерфейс на Java, пока ваш класс не абстрактный, вам нужно обеспечить реализацию всех методов, что очень болезненно. С другой стороны, абстрактный класс может помочь вам в этом случае, предоставив реализацию по умолчанию.

По этой причине я предпочитаю иметь в интерфейсе минимум методов, начиная с одного, мне не нравится идея маркерного интерфейса, когда в Java 5 введены аннотации. Я делаю, чтобы лучше понять OOPS и шаблон проектирования, вы обнаружите, что большая часть интерфейса содержит только один или два метода, например. Runnable, Callable, ActionListener и т. д.

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

Когда использовать интерфейс и абстрактный класс в Java

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

Чтобы ответить на этот вопрос, вам нужно хорошо понимать такие концепции ООП, как полиморфизм, инкапсуляция, абстракция и наследование. Также важно знакомство со сцеплением и сплоченностью. Вы, по крайней мере, должны знать, что усилия по проектированию должны привести к уменьшению связанности и повышению согласованности, простоте обслуживания и т. д. и интерфейс на Java .

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

Одним из распространенных примеров в пользу интерфейса над абстрактным классом является случай Thread vs Runnable. Если вы хотите выполнить задачу и вам нужен метод run(), лучше реализовать интерфейс Runnable, чем расширять класс Thread.

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

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

3) Интерфейс в Java отлично подходит для определения типов. Программирование для интерфейсов, чем реализация, также является одним из полезных принципов объектно-ориентированного проектирования, который предполагает преимущество использования интерфейса в качестве аргумента функции, возвращаемого типа и т. д. будет ли определенный класс формировать иерархию ЯВЛЯЕТСЯ-А или иерархию МОЖЕТ-СДЕЛАТЬ-ЭТО. Если вы знаете, что будете создавать классы, например. Circle, Square, чем лучше создать абстрактный класс Shape, который может иметь area() и perimeter() в качестве абстрактного метода, а не определять Shape как интерфейс в Java. С другой стороны, если вы собираетесь создавать классы, которые могут думать и летать, вы можете использовать интерфейс Flyable вместо абстрактного класса.

5) Интерфейс обычно определяет возможности, например. Runnable может запускать(), Callable может вызывать(), Displayable может отображать(). Поэтому, если вам нужно определить возможности, рассмотрите возможность использования интерфейса. Поскольку класс может иметь несколько возможностей, то есть класс может быть как Runnable, так и Displayable одновременно. Как обсуждалось в первом пункте, поскольку java не допускает множественного наследования на уровне класса, единственным способом обеспечения множественных возможностей является использование интерфейсов.

6) Давайте посмотрим еще один пример использования абстрактного класса и интерфейса в Java, который связан с предыдущим пунктом. Предположим, у вас есть много классов для моделирования, которые являются птицами, которые могут летать, тогда было бы уместно создать базовый абстрактный класс, такой как Bird, но если вам нужно моделировать другие вещи вместе с птицами, которые могут летать, например. Самолеты, воздушные шары или воздушные змеи, чем лучше создать интерфейс Flyable, чтобы представить летающие функции.

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

7) Еще одно интересное использование абстрактного класса и интерфейса — определение контракта с использованием интерфейса и предоставление скелета с использованием абстрактного класса. java.util.List из среды сбора Java является хорошим примером этого шаблона. Список объявлен как интерфейс и расширяет интерфейс Collection и Iterable, а AbstractList — это абстрактный класс, который реализует список. AbstractList обеспечивает скелетную реализацию интерфейса List.

Преимущество использования этого подхода заключается в том, что он сводит к минимуму усилия по реализации этого интерфейса конкретным классом, например. ArrayList или LinkedList. Если вы не используете скелетную реализацию, например. абстрактный класс и вместо этого решите реализовать интерфейс List, тогда вам не только нужно реализовать все методы List, но и вы можете дублировать общий код. Абстрактный класс в этом случае уменьшает усилия по реализации интерфейса.

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

9) Использование интерфейса также помогает при реализации шаблона проектирования Dependency Injection и упрощает тестирование. Многие фреймворки для фиктивного тестирования используют это поведение.

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

Это все на Когда использовать Абстрактный класс и интерфейс в Java . Хотя обсуждение здесь сосредоточено вокруг Java, но данная концепция абстрактного класса и интерфейса выходит за рамки Java и также применима к другим объектно-ориентированным языкам, некоторые советы также применимы к другим языкам OOPS. Ключевым моментом, который следует помнить, является определение абстрактного класса и интерфейса, например. в C++ и C# он сильно различается, как в C++ и Java.

Единственным отличием является множественное наследование. Мы также обсудили некоторые ключевые различия между абстрактным классом и интерфейсом в Java, которые влияют на решение о выборе абстрактного класса вместо интерфейса или наоборот.