Содержание

ооп — Отличия абстрактного класса от интерфейса (abstract class and interface)

Мне кажется достаточно любопытным, что данный вопрос помечен тегом «ооп», но при этом во многих ответах явно просачиваются специфические аспекты конкретных языков программирования. Я же постараюсь дать ответ исходя из понятий ООП и лишь потом показать, почему вообще это различие появилось в некоторых языках программирования.

Абстрактные классы и интерфейсы имеют определенное отношение к наследованию, точнее к моделированию мира. С их помощью мы хотим выразить, что у определенной группы вещей в нашей системе есть что-то общее: некоторое общее поведение, которое отличает эту группу штуковин от всех остальных.

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

  • Конкретная фиксированная операция, которая должна быть абсолютно стабильно для всех типов кнопок.

  • Конкретная операция с поведением по умолчанию (т.е. операция, чье поведение подходит для многих типов кнопок, но могут быть кнопки с другим поведением).

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

Другими словами, тип Кнопки может содержать невиртуальные методы (non-virtual methods), виртуальные методы

(virtual methods) и абстрактные методы (abstract methods).

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

После того, как мы определили базовый тип, пришло время определить произвольные типы. И тут начинаются вопросы. Точнее, вопросов никаких не возникает, когда у типа есть лишь один непосредственный базовый тип или все базовые типы содержат лишь декларации операций. Не проблема, унаследовать «Кнопку меню» от «Кнопки» и переопределить метод «Нажать на кнопку». Но что, если наш тип «Кнопка меню» будет отнаследован от двух типов с одной и той же виртуальной операцией? Как переопределить лишь одну, а оставить другую? А как быть клиенту нового типа и различить, какую операцию вызвать? А что если у двух базовых типов есть поле с одним именем? А что если у одного базового типа метод «Нажать кнопку» реализован, а у другого – лишь описан в виде декларации?

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

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

  • Интерфейс – описывает некоторое семейство типов и содержит лишь декларации операций (да, я осознанно пишу слово «декларация», а не использую слово «контракт», которое в ООП имеет вполне определенное значение).

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

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

    Есть еще один подвид конкретных классов – запечатанный (sealed) класс – это разновидность конкретного класса отнаследоваться от которого невозможно, а значит он может содержать лишь конкретные операции.

Выделение интерфейсов в отдельную категорию полезно не только с точки зрения упрощения реализации языков программирования, но и для выделения разных подходов к моделированию. Так, например, наследование классов моделирует отношение «Является» («Кнопка меню» ЯВЛЯЕТСЯ «Кнопкой»), а базовые классы обычно содержат определенный функционал, тесно связанный с функционалом производного класса. Базовые классы не просто моделируют группу типов, но и позволяют использовать повторно существующий функционал.

Интерфейсы же, по своей природе обладают меньшей связностью (low coupling), поскольку не обладают конкретным поведением, которое может осложнить жизнь класса-наследника. Интерфейсы также могут моделировать отношение «Является» («Кнопка меню» ЯВЛЯЕТСЯ «IКнопкой»), но могут определять и менее жесткое отношение «Может выполнять роль» (CAN DO). Например, интерфейс IEquatable

из BCL определяет «дополнительное» поведение, которое говорит о возможности типов сравнивать значения объектов.

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

javadevbloger Java,Интерфейсы и абстрактный класс

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

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

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

  1. Ключевое слово abstract используется для того, чтобы создать абстрактный класс с методами, а ключевое слово interface  используется для создания интерфейса и не может быть использовано с методами.
  2. Подклассы используют ключевое слово extends чтобы наследовать абстрактный класс. При этом они должны обеспечить реализацию всех заявленных методов в абстрактном классе. Если же подкласс не является абстрактным классом и использует ключевое слово implements для реализации интерфейсов, то он должен обеспечить реализацию для всех методов, объявленных в интерфейсе.
  3. Абстрактные классы могут иметь методы с реализации, тогда как интерфейс обеспечивает абсолютную абстракцию и не может иметь каких-либо реализаций метода.
  4. Абстрактные классы могут иметь конструкторы; интерфейсы не могут иметь конструкторов.
  5. У абстрактного класса есть все черты обычного Java-класса, за исключением того, что мы не можем создать его экземпляр. Мы можем использовать ключевое слово abstract чтобы создать абстрактный класс. Интерфейс может иметь только статические public static final константы и объявления методов.
  6. Абстрактные методы классов могут иметь public, private, protected и static модификаторы доступа, а методы интерфейса неявно
    public
    и abstract, поэтому мы не можем использовать другие модификаторы доступа с методами интерфейса.
  7. Подкласс может наследовать только один абстрактный класс, и реализовать несколько интерфейсов.
  8. Абстрактный класс может наследовать другой класс и реализовывать интерфейсы, а интерфейс может только наследовать другие интерфейсы.
  9. Мы можем запустить абстрактный класс, если он имеет метод main(). Мы не можем запустить интерфейс, потому что у него не может быть реализации метода main().
  10. Интерфейс обеспечивает так называемый контракт для всех классов, которые реализуют интерфейс.
    Абстрактный классы
     — класс с реализацией метода по умолчанию для подклассов.

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

Интерфейс или абстрактный класс?

Выбор между интерфейсом и абстрактным классом зависит от многих факторов. Давайте рассмотрим основные аргументы в пользу интерфейсов и абстрактных классов.

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

Используйте интерфейсы и абстрактные классы

В большинстве случаев использование интерфейсов вместе с абстрактными классами будет лучшим решением для любого проекта.  Например, в JDK есть java.util.List — интерфейс, который содержит много методов. Также там есть абстрактный класс java.util.AbstractList, который является костяком для всех методов интерфейса List. Это значит, что любой подкласс может наследовать этот класс и реализовать только необходимые ему методы.

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

Изменения в Java 8 интерфейсах

Начиная с Java 8 появилась возможность писать реализацию методов в интерфейсах. Мы можем создавать методы по умолчанию, а также статические методы в интерфейсах и обеспечить их реализацию. Следите за обновлениями на Javadevblog.com, чтобы не пропустить новые статьи об интерфейсах в Java 8.

Programming stuff: Интерфейсы vs. Абстрактные классы

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

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

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

Разница появляется с точки зрения языка программирования, разработчики которого решили не морочить голову с полноценным множественным наследованием: «ромбовидным наследованием», конфликтами имен из разных базовых классов и т. п. вещами.

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

Интерфейс vs. Абстрактный класс – это компромисс между свободой клиента интерфейса/класса и свободой разработчика.

  • Интерфейс «гибче» с точки зрения клиентов: любой класс может реализовать любой интерфейс. Но интерфейс «жёстче» с точки зрения его разработчика: его сложнее изменять (нарушится работа всех клиентов), нельзя наложить ограничения на конструктор клиентов, нельзя использовать код повторно.

  • Абстрактный класс «жёстче» с точки зрения клиентов: клиент будет вынужден отказаться от текущего базового класса. Но абстрактный класс «гибче» с точки зрения его разработчика: он позволяет использовать код повторно, ограничить конструктор наследников, позволяет вносить изменения (легко добавить виртуальный метод, не сломав существующих клиентов), четче задавать «контракт» с наследниками с помощью Шаблонных Методов.

Разница для библиотек

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

Квалина и Абрамс в своей книге “Framework Design Guidelines” дают такой совет:

«В общем случае, классы являются более предпочтительной конструкцией для моделирования абстракций. Главный недостаток интерфейсов в том, что они значительно менее гибкие, по сравнению с абстрактными классами, когда речь заходит об эволюции API. После выпуска интерфейса, набор его членов навеки является фиксированным. Любые изменения интерфейса сломают существующие типы, реализующие этот интерфейс.»

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

Различия для моделирования

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

Иногда бывает сложным понять, что должно быть «главным», а что – «второстепенным». Что важнее при моделировании кондиционеров? Иерархия кондиционеров с «вкраплением» интерфейсов бытовой техники, или иерархия бытовой техники с аспектами IAirConditioner?

На этот вопрос нет однозначного ответа, и иногда приходится перепрыгивать с одной «проекции» на другую.

Все зависит от степени повторного использования кода. Где больше поведения? Какую часть «каркаса» нужно реализовать, позволив наследникам предоставить лишь недостающие куски головоломки? Со стороны нельзя дать ответ на этот вопрос.

«Второстепенность» интерфейсов не значит, что они играют второстепенную роль в моделировании. Интерфейсы моделируют семейство типов, и не нужны, если семейство типов отсутствует.

Именно поэтому Марк Сииманн (автор замечательной книги “Dependency Injection in .NET”) вводит специальный принцип: “Reuse Abstraction Principle”. Принцип говорит, что пока у интерфейса не появится как минимум 3 реализации (моки – не всчет!), разработчик не может сказать, чем же является эта «абстракция», и какое такое «общее поведение» она моделирует.

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

Также Марк критикует подход слепого выделения интерфейса для класса. Такие интерфейсы называются “Header Interfaces” (по аналогии с заголовочными файлами в С++). Их проблема в том, что у них всегда лишь одна полноценная реализация + реализация в тестах. Клиенты таких интерфейсов обычно содержат неявные предположения о реализации, что сделает невозможным еще одну реализацию, которая не будет нарушать принцип замещения Лисков.

Подведем итог:

  • Интерфейсы и абстрактные классы моделируют семейства типов.

  • Интерфейсы накладывают минимум ограничений на клиентов, максимум ограничений на разработчика интерфейсов.

  • С абстрактными классами все наоборот: они позволяют использовать повторно код и предоставляют еще и «защищенный интерфейс»: протокол с наследниками.

  • Классы формируют основную иерархию, интерфейсы определяют «дополнительное» поведение.

Kotlin. Абстрактные классы и интерфейсы.

07 July 2020 2020-07-07T20:40:00+08:00

Время чтения 8 мин.

Абстрактные классы и интерфейсы объединены мной в одну тему, так как по своей сути они очень похожи. И те и другие имеют отношение к “моделированию” классов. С их помощью мы можем показать, что у определённой группы классов есть что-то общее: то, что их отличает от всех остальных. Ключевая разница между ними лишь в том, как их применять.

Абстрактные классы

Абстрактный класс — это класс, представляющий из себя “заготовку” для целого семейства классов, который описывает для них общий шаблон поведения. Такой класс не может быть создан. Т.е. нельзя создать его экземпляр. Он используются исключительно в качестве суперкласса, а его цель — моделирование поведения своего семейства, а также предоставление функционала для повторного использования. Другими словами абстрактный класс — это средство, для повторного использования кода.

Например, вы разрабатываете приложение, которое предоставляет информацию о деревьях. Тогда класс Tree должен быть абстрактным и объединять в себе свойства и функции, характерные для всех деревьев. А каждый наследник класса Tree будет по-своему их реализовывать.

Объявляется абстрактный класс при помощи ключевого слова abstract.

1
2
3
abstract class Tree {
  . ..
}

Наследование от такого класса осуществляется с помощью оператора :. При этом абстрактному классу не нужен модификатор open, потому что он “открыт” для наследования по умолчанию.

1
2
3
class Pine : Tree() {
  ...
}

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

1
2
3
4
5
abstract class Tree {
  abstract val name: String
  abstract val description: String
  abstract fun info()
}

Каждый наследник обязан переопределять их все.

1
2
3
4
5
class Pine : Tree() {
  override val name = "Сосна"
  override val description = "Хвойное дерево с длинными иглами и округлыми шишками"
  override fun info() = "$name - ${description. toLowerCase()}."  
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
abstract class Tree {
  abstract val name: String
  abstract val description: String
  fun info(): String = "$name - ${description.toLowerCase()}."
}
...
class Pine : Tree() {
  override val name = "Сосна"
  override val description = "Хвойное дерево с длинными иглами и округлыми шишками"
}
...
val pine = Pine()
println(pine.info())

Так как этот компонент класса уже не будет абстрактным, наследники не смогут его переопределить.

1
2
3
4
5
6
7
class Pine : Tree() {
  override val name = "Сосна"
  override val description = "Хвойное дерево с длинными иглами и округлыми шишками"
  // ошибка: функция "info" является "final" и не может быть переопределена
  override fun info() = description  
}

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

1
2
3
4
5
6
abstract class Tree {
  abstract val name: String
  abstract val description: String
  open fun info(): String = "$name - ${description.toLowerCase()}."
}

У абстрактного класса может быть конструктор.

1
2
3
abstract class Tree(val name: String, val description: String) {
  open fun info(): String = "$name - ${description.toLowerCase()}."
}

Тогда каждый наследник должен предоставить для него значения.

1
2
3
4
5
6
class Pine(name: String, description: String) : Tree(name, description)
. ..
val pine = Pine("Сосна", "Хвойное дерево с длинными иглами и округлыми шишками")
println(pine.info())


Интерфейсы

Интерфейс — это совокупность методов и правил, которые определяют поведение класса или общее поведение для группы независимых друг от друга классов. Интерфейсы похожи на абстрактные классы тем, что нельзя создать их экземпляры и они могут определять абстрактные или конкретные функции и свойства. Отличие в том, что интерфейсу не важна связь “родитель-наследник”, он задаёт лишь правила поведения.

К примеру, в нашем приложении уже есть целое семейство деревьев, информацию о которых можно с лёгкостью получить — их название и краткое описание. Но помимо этого деревья могут цвести и производить кислород. Такие методы можно добавить в абстрактный класс Tree, но что если мы решим помимо деревьев предоставлять информацию о, скажем, водорослях. У них тоже есть период цветения и они тоже производят кислород, но они не являются деревьями, а значит мы не можем наследовать их от класса Tree. Таким образом мы получили группу независимых друг от друга классов с одинаковым поведением, которое будет реализовываться через интерфейс Cultivable.

Объявляется интерфейс ключевым словом interface.

1
2
3
interface Cultivable {
  ...
}

Реализация интерфейса осуществляется аналогично наследованию: после имени класса ставится оператор : и название интерфейса.

1
2
3
4
5
6
7
abstract class Tree : Cultivable {
  ...
}
class Seaweed : Cultivable {
  ...
}

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

1
2
3
4
interface Cultivable {
  val bloom: Boolean
  fun startPhotosynthesis()
}

Класс должен реализовывать все абстрактные свойства и функции, определённые в интерфейсе.

1
2
3
4
5
6
7
8
9
10
abstract class Tree : Cultivable {
  abstract val name: String
  abstract val description: String
  open fun info(): String = "$name - ${description.toLowerCase()}."
  override val bloom = false
  override fun startPhotosynthesis() {
    ...
  }
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
abstract class Tree : Cultivable {
  abstract val name: String
  abstract val description: String
  open fun info(): String = "$name - ${description.toLowerCase()}."
  override fun startPhotosynthesis() {
    ...
  }
}
class Pine : Tree() {
  override val name = "Сосна"
  override val description = "Хвойное дерево с длинными иглами и округлыми шишками"
  override val bloom = false
}

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

1
2
3
4
5
6
7
8
interface Cultivable {
  val bloom: Boolean
    get() = false
  fun startPhotosynthesis() {
    . ..
  }
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
interface Fruitable {
  val fruit: String
    get() = "неплодоносный"
}
interface Cultivable : Fruitable {
  ...
  fun isFruitable() : Boolean {
    if(fruit == "неплодоносный") return false
    return true
  }
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class AppleTree() : Tree() {
  override val name = "Яблоня"
  override val description = "Фруктовое дерево"
  override val fruit = "яблоко"
}
...
val appleTree = AppleTree()
if(appleTree. isFruitable()) {
  println("Плод - ${appleTree.fruit}.")
} else {
  println("${appleTree.name} не плодоносит.")
}


Шпаргалка: абстрактный класс или интерфейс?

  • У вас есть семейство классов, из которых можно выделить общую сущность? Определите эту сущность в качестве абстрактного класса и она будет “заготовкой” для всего семейства.
  • Вам нужно создать более конкретную версию класса? Создайте подкласс этого класса и добавьте недостающее поведение.
  • Требует определить общее поведение для группы независимых друг от друга классов? Создайте интерфейс и реализуйте его теми классами, которым необходимо это поведение.

Ключевые моменты

  • Абстрактный класс — это “заготовка” для целого семейства классов.
  • Нельзя создать экземпляр абстрактного класса.
  • Абстрактный класс может содержать как абстрактные, так и конкретные реализации свойств и функций.
  • Класс, который содержит абстрактное свойство или функцию, должен быть объявлен абстрактным.
  • Абстрактный класс может быть без единого абстрактного свойства или функции.
  • У класса может быть только один суперкласс.
  • Наследники абстрактного класса должны переопределять все его абстрактные свойства и функции.
  • Чтобы наследники могли переопределять конкретные реализации свойств и функций, для них в абстрактном классе должен быть явно указан модификатор open.
  • У абстрактного класса может быть конструктор.
  • Интерфейс определяет поведение класса или общее поведение для группы независимых друг от друга классов.
  • Нельзя создать экземпляр интерфейса.
  • Интерфейс может содержать как абстрактные, так и конкретные реализации функций.
  • Свойства интерфейсов могут быть абстрактными, а могут иметь get() методы.
  • Класс может реализовывать несколько интерфейсов.
  • Класс должен реализовывать все абстрактные свойства и функции, определённые в интерфейсе.
  • Если интерфейс реализовывается абстрактным классом, то переопределение его абстрактных свойств и функций может быть передана наследникам абстрактного класса.
  • Интерфейс может реализовывать другой интерфейс.

Полезные ссылки

Abstract classes — официальная документация.
Абстрактные классы — перевод на русский (об абстрактных классах в самом низу статьи).
Interfaces — официальная документация.
Интерфейсы — перевод статьи про интерфейсы на русский.

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

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

ИТ-викторина

Проверьте свои знания по темам, связанным с технологиями

1 / 10

Какая из следующих наиболее продвинутых форм ИИ?

Нейронная сеть

Машинное обучение

Наука данных

Глубокое обучение

2 / 10

«Интернет вещей» относится к

Интернет вещей

Интранет телесервисов

Международная организация телеуслуг

Интернет-организация телекоммуникаций

3 / 10

Брандмауэр на компьютере используется для

Охранник

Передача Информации

Аутентификация

мониторинг

4 / 10

Какие два веб-сайта предлагают бесплатные услуги электронной почты?

Яху и Амазон

Яху и Гугл

Ай-Тьюнс и Твиттер

Сайт библиотеки и Hotmail

5 / 10

Геостационарный спутник вращается со скоростью –

Любая высота

Фиксированная высота

Высота над столбом

Высота, которая зависит от его массы

6 / 10

Марк Цукерберг — владелец

Facebook

Google

Linux

Linkedln

7 / 10

Кто основал Apple Computers?

Стив Джобс

Стив Джобс и Стив Возняк

Билл Гейтс

Говард Айкен

8 / 10

Какой веб-браузер разработан Google

IE

FireFox

Safari

Chrome

9 / 10

Основная функция умных помощников вроде Apple Siri и Amazon Alexa —

Пытаюсь распознать голос

Пытаюсь читать из словаря

Поиск слова в базе данных

Ни один из этих

10 / 10

Системы для людей с ограниченными возможностями являются примером

Распознавание лиц

Поиск изображений на основе содержимого

Умные взаимодействия

Восприятие окружающей среды

ваш счет

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

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

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

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

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

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

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

Сравнительная таблица
Параметры сравненияАбстрактный класс в JavaИнтерфейс в Java
Ключевое словоДля объявления абстрактного класса используется ключевое слово abstract.    Для объявления интерфейса используется ключевое слово interface.
методыВ абстрактном классе могут присутствовать как неабстрактные, так и абстрактные методы.    В интерфейсе может быть представлен только абстрактный метод. Он также может иметь статические методы и методы по умолчанию, начиная с Java 8.
ПеременныеАбстрактный класс может иметь такие переменные, как нестатические, нефинальные, статические и конечные переменные.    В интерфейсе могут быть только конечные и статические переменные.
наследованиеМножественное наследование не поддерживается абстрактным классом.    Множественное наследование поддерживается интерфейсом.
РасширениеДругой java может быть расширен, и несколько интерфейсов java могут быть реализованы абстрактным классом.    Только другой интерфейс в Java имеет возможность быть расширенным интерфейсом.

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

В Java абстрактный класс — это класс, объявленный с помощью ключевого слова abstract. Как неабстрактные, так и абстрактные методы могут быть включены в абстрактный класс в Java.

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

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

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

При использовании абстрактного класса в Java наиболее важными правилами являются:

  • При объявлении абстрактного класса очень важно иметь ключевое слово «abstract».
  • В Java создание экземпляра абстрактного класса невозможно напрямую. В абстрактном классе требуется как минимум один абстрактный метод.
  • Окончательные методы также включены в абстрактный класс.
  • Статические методы и методы конструктора могут быть включены в абстрактный класс.

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

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

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

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

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

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

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

Основные свойства интерфейса Java:

  • Интерфейс в Java полностью абстрактен. Абстрактные ключевые слова не требуются при объявлении интерфейса в Java.
  • Каждый из методов интерфейса также полностью абстрактен. В результате нет необходимости использовать абстрактные ключевые слова при объявлении методов интерфейса.
  • Каждый метод интерфейса полностью общедоступен.

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

Основные различия между абстрактным классом и интерфейсом в Java
  1. В абстрактном классе могут присутствовать как неабстрактные, так и абстрактные методы. С другой стороны, в интерфейсе могут быть представлены только абстрактные методы. Он также может иметь статические методы и методы по умолчанию, начиная с Java 8.
  2. Абстрактный класс может иметь нестатические, статические, неконечные и конечные переменные. В интерфейсе могут быть только конечные и статические переменные.
  3. Для объявления абстрактного класса используется ключевое слово abstract. Для объявления интерфейса используется ключевое слово interface.
  4. Множественное наследование не поддерживается абстрактным классом. Множественное наследование, наоборот, поддерживается интерфейсом.
  5. Другой java может быть расширен, и несколько интерфейсов java могут быть реализованы абстрактным классом, но только другой интерфейс в Java имеет возможность быть расширенным интерфейсом.

Рекомендации
  1. https://scholar.google.com/scholar?hl=en&as_sdt=0%2C5&q=abstract+class+in+java&btnG=#d=gs_qabs&u=%23p%3DW3WgwQb0NOAJ
  2. https://scholar.google.com/scholar?hl=en&as_sdt=0%2C5&q=interface+in+java&btnG=#d=gs_qabs&u=%23p%3Dzhwh4VcdqSkJ

Один запрос?

Я приложил столько усилий, чтобы написать этот пост в блоге, чтобы предоставить вам ценность. Это будет очень полезно для меня, если вы подумаете о том, чтобы поделиться им в социальных сетях или со своими друзьями/родными. ДЕЛИТЬСЯ ♥️

Сандип Бхандари

Сандип Бхандари имеет степень бакалавра вычислительной техники Университета Тапар (2006 г.). Имеет 20-летний опыт работы в сфере технологий. Он проявляет большой интерес к различным техническим областям, включая системы баз данных, компьютерные сети и программирование. Подробнее о нем можно прочитать на его био страница.

краткое описание, характеристики и особенности. Чем отличается абстрактный класс от интерфейса

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

Абстрактные классы

Так в программировании называют единицу программного кода, на основе которой не могут создаваться объекты. Следует отметить, что наследники данного класса могут быть не абстрактными. Поэтому создание объектов на их основе является вполне возможным. Если рассматривать пример из Java, то построим такую модель: мы можем описать конструкторы в классе А. Но вот воспользоваться ими мы не сможем. Выходом из этой ситуации является объявление какой-то переменной как ссылки. Причем необходимо четко прописать, чтобы она указывала на объект класса А. А вот как это можно сделать? В этом нам поможет приведение. При этом необходимо учитывать, что класс-родитель всегда считается более универсальным, чем потомок. Во многих языках программирования приведение используется автоматически. Но если нет уверенности в наличии такого механизма, значит, необходимо явно указать ссылку на объект.


Классы — что это? Отвечаем на вопрос. Значение и синонимы…

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

Абстрактные методы

Что они собой представляют? Абстрактными называют те методы, которые не имеют реализации в рассматриваемом классе. Так, после круглых скобок (в которых перечисляются используемые в них аргументы) ставят не открывающие фигурные (после чего размещается блок описания метода), а только точку с запятой. Таким образом, в данном случае отсутствует информация о том, что он делает. Тут можно задать вопрос: «А зачем метод без реализации?» Ведь он не подлежит использованию! Конечно, в том классе, где он был описан, такое не является возможным. А вот если рассматривать эту ситуацию с точки зрения потомка, то его можно будет вызвать. И функционировать он будет по конкретному описанию, имеющемуся в данном классе.


Модель «черного ящика»: структурная схема

Модель непрозрачного (черного) ящика считается самой простой в системологии. Между тем, при ее…

Особенности абстрактных методов

Существуют ограничения в их использовании. Рассмотрим это на примере языка программирования Java. Здесь есть такое требование: если в классе есть хотя бы один такой метод, то он обязательно должен быть абстрактным. А в каких случаях уместно использовать такие конструкции? Давайте разберёмся с этим на примере классов домашних животных. Для начала следует уяснить, что нет такого звука, который бы издавали они все. Поэтому в самом общем классе не задаётся реализация метода звучания. Но для него создаётся тело, которое обособленно с помощью блоков. А уже в последующем, когда будет создаваться класс собаки, кота или хомячка, будет прописываться отдельный метод для него, в рамках которого будут раскрываться все особенности.

Интерфейс

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

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

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

Абстрактные данные

Это понятие ключевое в программировании. В данном случае под абстракцией понимают независимое рассмотрение и разделение интерфейса и его реализации. Давайте рассмотрим пример. У нас есть телевизор, который является объектом или модулем. Он обладает интерфейсом. В качестве такового выступают средства управления им, а также воспроизведения звука и изображения. Чем более совершенный интерфейс применяется, тем удобней телевизор в процессе использования. Мы можем переключать программы, нажимая на какие-то кнопки. При этом нет нужды думать про физические процессы в телевизоре. О них заботятся специалисты, которые собирают устройство. Нас как пользователей интересуют только свойства. Возвращаясь к программированию, можно сказать, что ими по такой аналогии являются интерфейс и реализация. Также, если человек уверен в своих знаниях, то он может «снять» крышку у нашего гипотетического телевизора и усовершенствовать его. Хотя это может приводить к локальным успехам, в большинстве случаев конечный результат негативный. Поэтому в программировании поддерживается запрет доступа и скрытие внутренних компонентов для абстрактных данных. Принцип этого механизма предусматривает наличие способов предотвращения умышленного или случайного изменения внутренних компонентов. И когда говорят про абстрактные типы данных, то подразумевают их совокупность с множеством операций, которые могут быть выполнены над ними.

Объекты

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

Наследование

Поскольку программирование строится на построении иерархического дерева связей между объектами, то поднимается вопрос о том, чтобы нижележащим типам были переданы свойства родительских библиотек кода. Под наследованием понимают отношения, когда кто-то один повторяет поведение и структуру чего-то другого. В обычной жизни это можно встретить повсеместно. Подобное было перенесено и в программирование относительно абстрактных элементов. В качестве сравнения можно привести тот факт, что нет такого организма, как птица. Это абстрактное название. В качестве конкретного экземпляра приводят чайку, соловья или воробушка. Благодаря наличию наследования мы можем использовать библиотеки классов, а также развивать их для конкретной программы. Такой инструмент позволяет нам создавать новые объекты, попутно дополняя или изменяя свойства уже созданного. Наследник получает все методы и поля своего предка и при необходимости обзаводится своими собственными атрибутами. Благодаря тому что есть абстрактные элементы и принцип наследия, существуют широкие возможности для модификации в рамках объектно-ориентированного программирования. К тому же это позволяет гибко подходить к решению поставленных задач. При наследовании в новый класс передаются данные и функции.

Полиморфизм

Он необходим для того, чтобы применять одинаковые функции для решения различных типов задач. В данном случае предусматривается наличие возможности совершения различных действий, содержание которых будет зависеть от типа объекта, с которым ведётся работа. Под полиморфизмом понимают свойство элементов, которые имеют одного общего родителя, выполнять похожие в смысловом значении проблемы различными способами. Проведём аналогию с животными. Есть такое действие – бежать. Все мы понимаем, как оно происходит. Но разными животными (львом, слоном, шимпанзе, крокодилом, черепахой) это действие будет выполняться по-разному. В данном случае за их перемещение отвечает разработчик, который при надобности может вызвать для конкретного случая определённую подпрограмму, разработав алгоритм и успешно реализовав его. Это делается с помощью набора методов. При этом в каждом отдельном классе программистом указывается, какому объекту какие свойства присущи. Меняя что-то в потомках, можно добиться выполнения определённых, нужных в данном случае действий. Такое влияние называется полиморфизмом объектов. В целом абстрактный класс является чрезвычайно полезным инструментом программирования.

oop — В чем разница между интерфейсом и абстрактным классом?

Многие младшие разработчики ошибочно думают об интерфейсах, абстрактных и конкретных классах как о незначительных вариациях одного и того же и выбирают один из них чисто по техническим причинам: Нужно ли мне множественное наследование? Нужно ли мне какое-то место для размещения общих методов? Нужно ли мне беспокоиться о чем-то другом, кроме конкретного класса? Это неправильно, и в этих вопросах скрыта главная проблема: «Я» . Когда вы пишете код для себя, вы редко думаете о других нынешних или будущих разработчиках, работающих над вашим кодом или с ним.

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

Резюме

  1. Интерфейс определяет контракт , который некоторая реализация выполнит для вас .

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

Альтернативное резюме

  1. Интерфейс для определения общедоступных API
  2. Абстрактный класс предназначен для внутреннего использования и для определения SPI

О важности сокрытия деталей реализации

Конкретный класс выполняет фактическую работу очень специфическим образом. Например, ArrayList использует непрерывную область памяти для компактного хранения списка объектов, что обеспечивает быстрый произвольный доступ, итерацию и изменения на месте, но плохо справляется со вставками, удалениями и иногда даже добавлениями; тем временем LinkedList использует узлы с двойной связью для хранения списка объектов, который вместо этого предлагает быструю итерацию, изменения на месте и вставку/удаление/добавление, но ужасен при произвольном доступе. Эти два типа списков оптимизированы для разных вариантов использования, и очень важно, как вы собираетесь их использовать. Когда вы пытаетесь выжать производительность из списка, с которым вы интенсивно взаимодействуете, и когда выбор типа списка зависит от вас, вы должны тщательно выбирать, какой из них вы создаете.

С другой стороны, высокопоставленным пользователям списка все равно, как он на самом деле реализован, и их следует изолировать от этих деталей. Давайте представим, что Java не предоставляет интерфейс List , а имеет только конкретный класс List , который на самом деле является тем, чем сейчас является LinkedList . Все Java-разработчики адаптировали бы свой код к деталям реализации: избегали случайного доступа, добавляли кеш для ускорения доступа или просто повторно реализовывали ArrayList 9.0042 сами по себе, хотя это было бы несовместимо со всем другим кодом, который на самом деле работает только с Список . Это было бы ужасно... Но теперь представьте, что мастера Java на самом деле понимают, что связанный список ужасен для большинства реальных случаев использования, и решили переключиться на список массивов для своего единственного доступного класса List . Это повлияет на производительность каждой Java-программы в мире, и людям это не понравится. И главный виновник в том, что детали реализации были доступны, и разработчики предполагали, что эти детали являются постоянным контрактом, на который они могут положиться. Вот почему важно скрывать детали реализации и определять только абстрактный контракт. В этом и заключается цель интерфейса: определить, какие входные данные принимает метод и какие ожидаемые выходные данные, не выставляя напоказ всю кишку, которая соблазнила бы программистов настроить свой код, чтобы он соответствовал внутренним деталям, которые могут измениться с любым будущим обновлением. .

Абстрактный класс находится посередине между интерфейсами и конкретными классами. Предполагается, что это поможет реализациям совместно использовать общий или скучный код. Например, AbstractCollection обеспечивает базовые реализации для isEmpty на основе размера 0, содержит как итерацию и сравнение, addAll как повторение add и так далее. Это позволяет реализациям сосредоточиться на важных частях, которые различают их: как на самом деле хранить и извлекать данные.

API по сравнению с SPI

Интерфейсы представляют собой шлюзы с низкой связностью между различными частями кода. Они позволяют библиотекам существовать и развиваться, не нарушая работу каждого пользователя библиотеки, когда что-то меняется внутри. Он называется Application Programming Interface , а не классы прикладного программирования. В меньшем масштабе они также позволяют нескольким разработчикам успешно сотрудничать в крупномасштабных проектах, разделяя различные модули с помощью хорошо документированных интерфейсов.

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

Разница между API и SPI тонкая, но важная: для API основное внимание уделяется тому, кто его использует, а для SPI основное внимание уделяется тому, кто его реализует.

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

Примечание о Java 8 и методах по умолчанию

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

Какой использовать?

  1. Является ли вещь публично используемой другими частями кода или другим внешним кодом? Добавьте к нему интерфейс, чтобы скрыть детали реализации от публичного абстрактного контракта, что является общим поведением вещи.
  2. Является ли вещь чем-то, что должно иметь несколько реализаций с большим количеством общего кода? Сделать и интерфейс, и абстрактную, незавершенную реализацию.
  3. Будет ли когда-нибудь только одна реализация, и никто другой не будет ее использовать? Просто сделайте его конкретным классом.
    1. "когда-либо" - это долго, вы можете перестраховаться и добавить интерфейс поверх него.

Следствие: наоборот часто делается неправильно: при использовании вещи всегда старайтесь использовать самый общий класс/интерфейс, который вам действительно нужен. Другими словами, не объявляйте ваши переменные как ArrayList theList = new ArrayList() , если на самом деле у вас нет очень сильной зависимости от того, что это список массива , и никакой другой тип списка не урежет его для вас. Вместо этого используйте List theList = new ArrayList или даже Collection theCollection = new ArrayList , если тот факт, что это список, а не любой другой тип коллекции, на самом деле не имеет значения.

Документация JDK 19 — главная страница

  1. главная страница
  2. Ява
  3. Ява SE
  4. 19

Обзор

  • Прочтите меня
  • Примечания к выпуску
  • Что нового
  • Руководство по миграции
  • Загрузить JDK
  • Руководство по установке
  • Формат строки версии

Инструменты

  • Технические характеристики инструментов JDK
  • Руководство пользователя JShell
  • Руководство по JavaDoc
  • Руководство пользователя средства упаковки

Язык и библиотеки

  • Обновления языка
  • Основные библиотеки
  • HTTP-клиент JDK
  • Учебники по Java
  • Модульный JDK
  • Руководство программиста API бортового регистратора
  • Руководство по интернационализации

Технические характеристики

  • Документация API
  • Язык и ВМ
  • Имена стандартных алгоритмов безопасности Java
  • банка
  • Собственный интерфейс Java (JNI)
  • Инструментальный интерфейс JVM (JVM TI)
  • Сериализация
  • Проводной протокол отладки Java (JDWP)
  • Спецификация комментариев к документации для стандартного доклета
  • Прочие характеристики

Безопасность

  • Руководство по безопасному кодированию
  • Руководство по безопасности

Виртуальная машина HotSpot

  • Руководство по виртуальной машине Java
  • Настройка сборки мусора

Управление и устранение неполадок

  • Руководство по устранению неполадок
  • Руководство по мониторингу и управлению
  • Руководство по JMX

Client Technologies

  • Руководство по специальным возможностям Java

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

Разработчики считают Java одним из самых популярных языков программирования. Несмотря на свой возраст и появление Python в качестве альтернативы, стабильность и популярность Java гарантируют, что язык будет неотъемлемой частью разработки на долгие годы.

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

Теперь, прежде чем мы начнем с абстрактного класса и интерфейса Java, давайте начнем с некоторых определений.

Что такое абстракция? Переподготовка

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

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

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

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

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

Невозможно создать экземпляр абстрактного класса, то есть с его помощью нельзя создать объект.

Программисты используют абстрактный класс вместо интерфейса Java, когда им нужно:

  • Функциональность по умолчанию для подклассов
  • Шаблоны для будущих специальных классов
  • Определение общего интерфейса для любых подклассов
  • Повторное использование кода

Прежде чем мы начнем с различий между абстрактным классом и интерфейсом в Java, давайте узнаем больше об интерфейсе в Java.

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

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

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

Интерфейсы не могут быть созданы, хотя абстрактные классы, реализующие интерфейсы, могут.

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

  • Для достижения абстракции
  • Для поддержки динамического разрешения во время выполнения
  • Достижение слабой связи
  • Отделение определения метода от иерархии наследования

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

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

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

 

Абстрактный класс

Интерфейс

Модификаторы доступа

Может иметь модификатор доступа

Не имеет модификаторов доступа, и все, что определено внутри, считается общедоступным модификатором

Конструкторы

Может объявлять конструкторы и деструкторы

Невозможно объявлять конструкторы или деструкторы

Поля данных

Может иметь поля данных

Не может иметь полей данных

Доступность элемента данных

Может иметь член класса любого типа (например, общедоступный, частный, защищенный)

Может иметь только публичных членов, по умолчанию

Определение полей

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

Невозможно определить поля

Пределы расширения

Одновременно расширяет только один класс или один абстрактный класс. Может расширить другой обычный (или конкретный) класс.

Можно расширить любое количество интерфейсов. Однако он может расширять только интерфейсы.

Скорость внедрения

Быстрее, чем интерфейс

Интерфейс работает медленнее и требует дополнительной косвенности или разыменования

Создание экземпляра

Невозможно создать экземпляр, но его можно вызвать, если main() существует

Невозможно создать экземпляр, так как он абсолютно абстрактный

Используемые ключевые слова

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

.

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

.

Методы

Может иметь абстрактные и неабстрактные методы. Может иметь реализацию метода по умолчанию

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

Множественное наследство

Может иметь только один абстрактный класс

Может реализовать несколько интерфейсов

Структура

Только абстрактные методы

Абстрактные и конкретные методы

Типы переменных

Может иметь конечные, неконечные, статические и нестатические переменные

Может иметь только окончательные и статические переменные

Когда следует использовать

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

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

Как узнать больше о Java и Javascript

Как в Java, так и в JavaScript можно многому научиться. К счастью, существует множество ресурсов, которые помогут вам освоиться. Но вместо того, чтобы рыскать по всем уголкам Интернета в поисках различных курсов, вы можете посетить Simplilearn и найти широкий выбор курсов и бесплатных ресурсов на выбор.

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

Курс дает вам все необходимое для сертификации Java, включая 70 часов смешанного обучения, практическое кодирование и реализацию двух веб-проектов, 35 упражнений по кодированию, связанных с Java 8 и средами Hibernate и Spring. Вы также получите пожизненный доступ к ресурсам для самостоятельного обучения и, конечно же, сертификат сертификации Java, который выдается после того, как вы соответствуете критериям.

Сертификационное обучение в рамках последипломной программы Full Stack Web Development дает вам всесторонние знания в области технологий разработки и тестирования программного обеспечения, таких как JavaScript, Node.js, Angular, Docker и Protractor. Однако, если вы больше склоняетесь к автоматическому тестированию, вам следует изучить программу магистра инженеров-испытателей по автоматизации. Эта программа дает вам глубокие знания о современных актуальных технологиях тестирования программного обеспечения. Вы узнаете о Selenium Web Driver, TestNG, Maven, AutoIT, Selenium Grid, Appium и Docker, а также о том, как они могут помочь вам в разработке надежной среды тестирования.

По данным Indeed, Java-разработчики могут зарабатывать в среднем 104 463 доллара США в год, включая денежные бонусы в размере 5 000 долларов США. Glassdoor сообщает, что Java-разработчики в Индии могут получать среднюю годовую базовую зарплату в размере 457 826 фунтов стерлингов.

И Java не исчезнет в ближайшее время! Спрос на Java-разработчиков остается высоким, хотя языку уже 25 лет (вечность в мире ИТ!). Карьера в качестве разработчика Java обеспечивает стабильность работы и отличные преимущества, особенно если вы понимаете нюансы между абстрактным классом и интерфейсом Java. Если все это звучит привлекательно, посетите Simplilearn и начните свою карьеру уже сегодня!

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

С тех пор, как в JDK 8 разрешены конкретные (не абстрактные) методы в интерфейсе, такие как методы по умолчанию и статические методы, многие из моих читателей спрашивали меня, как им следует отвечать на классические вопросы об абстрактном классе и интерфейсе. Раньше интерфейс не мог иметь никаких конкретных методов, и это было основным различием между абстрактным классом и интерфейсом, но теперь это не так. В этом посте я вернусь к этому очень популярному вопросу интервью по Java в свете изменений в Java 8. Это также популярный вопрос на собеседовании по Java, и знание разницы поможет вам ответить на этот вопрос на настоящем собеседовании.

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

Но основное различие между абстрактным классом и интерфейсом в Java 8 заключается в том, что абстрактный класс — это класс, а интерфейс — это интерфейс. У класса может быть состояние, которое можно изменить с помощью неабстрактных методов, но интерфейс не может иметь состояние, потому что у них не может быть переменных экземпляра.

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

Возникает много вопросов, которые мы обсудим в следующем разделе, кстати, если вы новичок в мире Java и только начали изучать Java, я предлагаю вам использовать актуальный курс. нравится The Complete Java MasterClass  на Udemy, потому что Java меняется очень быстро. Всего за год мы перешли с Java 9 на Java 12. К счастью, этот курс актуален, и автор старается обновлять его с каждым выпуском Java.

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

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

1) Абстрактные классы — это классы , поэтому они не ограничены другими ограничениями интерфейса в Java, например, абстрактный класс может иметь состояние , но вы не можете иметь состояние интерфейса в Java.

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

На самом деле методы по умолчанию или защитные методы вводятся для обеспечения обратной совместимости и в то же время делают Collection API более подходящим для использования внутри ключевых функций Java 8, таких как лямбда-выражения.

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

Они защищают ваш код от внедрения новых методов, поэтому их также называют методами защиты. Если вы хотите узнать больше о методах по умолчанию или новых изменениях в Java 8 в целом, я предлагаю вам ознакомиться с этими курсами от Java 8 до Java 13 на таких сайтах, как Udemy и Pluralsight.

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

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

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

  • 5 книг для изучения Java 8 с нуля (книги)
  • Как присоединиться к строке в Java 8 (пример)
  • 5 лучших курсов для изучения Java-разработки с полным стеком (курсы)
  • Как использовать метод filter() в Java 8 (учебник)
  • 10 курсов Advanced Core Java для программистов (курсы)
  • Как форматировать/анализировать дату с помощью LocalDateTime в Java 8? (учебник)
  • Мои любимые бесплатные курсы для углубленного изучения Java (курсы)
  • Как использовать класс Stream в Java 8 (учебник)
  • 5 лучших курсов для изучения Lambdas и Stream в Java (курсы)
  • Как использовать метод forEach() в Java 8 (пример)
  • Как преобразовать список в карту в Java 8 (решение)
  • 20 примеров даты и времени в Java 8 (учебник)
  • Как использовать метод peek() в Java 8 (пример)
  • Как отсортировать карту по ключам в Java 8? (пример)
  • Как отсортировать май по значениям в Java 8? (пример)
  • 10 примеров опций в Java 8? (пример)
  • Как преобразовать лямбда-выражение в ссылку на метод в Java 8 (учебник)
  • 5 бесплатных курсов по Java 8 и Java 9 для программистов (курсы)

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

P. S. - Если ваша цель — изучить новые функции, появившиеся в Java 8, вы также можете ознакомиться с этими курсами Java Functional Programming и Stream API, в которых основное внимание уделяется только наиболее важным новым функциям (лямбда-выражениям и потокам) и ничему другому. .

абстрактный класс и интерфейс — sureshdevang

абстрактный класс и интерфейс

 

 

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

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

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

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

Когда использовать оба

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

Сводная таблица

Интерфейс
Интерфейсы и абстрактные классы
функция абстрактный класс
множественное наследование Класс может реализовывать несколько интерфейсов. Класс может расширять только один абстрактный класс.
реализация по умолчанию Интерфейс вообще не может предоставлять какой-либо код, тем более код по умолчанию. Абстрактный класс может предоставлять полный код, код по умолчанию и/или только заглушки, которые необходимо переопределить.
константы Только статические конечные константы, их можно использовать без уточнения в классах, реализующих интерфейс. С другой стороны, эти неквалифицированные имена загрязняют пространство имен. Вы можете использовать их, и не очевидно, откуда они берутся, поскольку квалификация не является обязательной. Возможны как экземплярные, так и статические константы. Для вычисления констант также можно использовать как статический код, так и код инициализатора экземпляра.
для удобства третьих лиц Реализация интерфейса может быть добавлена ​​к любому существующему стороннему классу. Сторонний класс должен быть переписан так, чтобы он расширялся только от абстрактного класса.
is-a vs -able или can-do Интерфейсы часто используются для описания периферийных способностей класса, а не его центральной идентичности, например. класс Automobile может реализовывать интерфейс Recyclable, который может применяться ко многим совершенно не связанным между собой объектам. Абстрактный класс определяет основную идентичность своих потомков. Если вы определили класс Dogabstract, то потомками далматинцев 90 577 будут 90 578  собаки, они не просто допускаются к собакам. Реализованные интерфейсы перечисляют общие вещи, которые может делать класс, а не то, чем он является.

В контексте Java пользователям обычно следует реализовывать интерфейс Runnable, а не расширять Thread, потому что они на самом деле не заинтересованы в предоставлении какой-либо новой функциональности Thread, они обычно просто хотят, чтобы какой-то код имел возможность работать независимо. Они хотят создать что-то, что можно будет запускать в потоке, а не новый тип потока. Подобные дебаты — «есть» или «есть» — возникают, когда вы решаете наследовать или делегировать.

множественное наследование для дальнейшего обсуждения is-a и has-a

подключаемый модуль Вы можете написать новый модуль замены для интерфейса, который не содержит ни одной палочки кода, общего с существующими реализациями. Когда вы реализуете интерфейс, вы начинаете с нуля без какой-либо реализации по умолчанию. Вы должны получить свои инструменты от других классов; ничего не приходит с интерфейсом, кроме нескольких констант. Это дает вам свободу для реализации радикально другого внутреннего дизайна. Вы должны использовать абстрактный класс как есть для базы кода со всем сопутствующим багажом, хорошим или плохим. Автор абстрактного класса навязал вам структуру. В зависимости от сообразительности автора абстрактного класса это может быть хорошо или плохо.
однородность Если все различные реализации являются общими для сигнатур методов, то интерфейс работает лучше всего. Если различные реализации относятся к одному типу и имеют общий статус и поведение, обычно лучше всего работает абстрактный класс. Еще один важный вопрос — это то, что я называю «гетерогенным против гомогенного». Если разработчики/подклассы однородны, стремитесь к абстрактному базовому классу. Если они неоднородны, используйте интерфейс. (Теперь все, что мне нужно сделать, это дать хорошее определение гетеро/гомогенного в этом контексте.) Если различные объекты все одного вида и имеют общее состояние и поведение, то они стремятся к общему. базовый класс. Если все, что они разделяют, — это набор сигнатур методов, то склоняйтесь к интерфейсу.
обслуживание Если ваш клиентский код говорит только с точки зрения интерфейса, вы можете легко изменить конкретную реализацию, стоящую за ним, используя фабричный метод. Как и в случае с интерфейсом, если ваш клиентский код говорит только в терминах абстрактного класса, вы можете легко изменить конкретную реализацию, стоящую за ним, с помощью фабричного метода.
скорость Медленно, требуется дополнительная косвенность, чтобы найти соответствующий метод в фактическом классе. Современные JVM открывают способы уменьшить это снижение скорости. Быстрота
Краткость Все объявления констант в интерфейсе считаются public static final, поэтому вы можете пропустить эту часть. Вы не можете вызывать какие-либо методы для вычисления начальных значений ваших констант. Вам не нужно объявлять отдельные методы абстрактного интерфейса. Все так считают. Вы можете поместить общий код в абстрактный класс, но не в интерфейс. Если интерфейсы хотят поделиться кодом, вам придется написать другую жевательную резинку, чтобы организовать это. Вы можете использовать методы для вычисления начальных значений ваших констант и переменных, как экземпляров, так и статических. Вы должны объявить все отдельные методы абстрактного класса abstract.
добавление функциональности Если вы добавляете новый метод в интерфейс, вы должны отследить все реализации этого интерфейса во вселенной и предоставить им конкретную реализацию этого метода. Если вы добавляете новый метод в абстрактный класс, у вас есть возможность предоставить его реализацию по умолчанию. Тогда весь существующий код продолжит работать без изменений.
  1. интерфейс содержит методы, которые должны быть абстрактными; абстрактный класс может содержать конкретные методы.
  2. Интерфейс
  3. содержит переменные, которые должны быть статическими и окончательными; абстрактный класс может содержать переменные non final и final.
  4. Члены
  5. в интерфейсе по умолчанию общедоступны, абстрактный класс может содержать непубличные члены.
  6. интерфейс
  7. используется для "осуществления"; тогда как абстрактный класс используется для «расширения».
  8. Интерфейс
  9. можно использовать для достижения множественного наследования; абстрактный класс может использоваться как одиночное наследование.
  10. Интерфейс
  11. может «расширять» другой интерфейс, абстрактный класс может «расширять» другой класс и «реализовывать» несколько интерфейсов.
  12. интерфейс
  13. абсолютно абстрактен; абстрактный класс может быть вызван, если существует main().
  14. Интерфейс
  15. является более гибким, чем абстрактный класс, потому что один класс может только «расширять» один суперкласс, но «реализовывать» несколько интерфейсов.
  16. Если есть выбор, используйте интерфейс вместо абстрактного класса.

Интерфейс
Интерфейсы реализованы
Интерфейсы не могут иметь конструкторов
Можно реализовать несколько интерфейсов (что позволяет множественное наследование)
Интерфейсы могут содержать только абстрактные методы или функции
все члены интерфейса являются общедоступными по умолчанию и не могут быть объявлены явно, поэтому
Все методы/функции интерфейса должны быть реализованы


Абстрактный класс

Абстрактные классы наследуются
Только один класс может быть унаследован
Абстрактные классы могут иметь как абстрактные, так и конкретные методы
Все абстрактные члены абстрактного класса должны быть объявлены общедоступными
Все абстрактные методы/функции абстрактного класса должны быть реализованы

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

b) В абстрактном классе ключевое слово abstract должно использоваться для методов
В то время как интерфейс нам не нужно использовать это ключевое слово для методов.

c) Абстрактный класс должен иметь подклассы, тогда как интерфейс не может иметь подклассов.

 

 

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

  • Интерфейсы тесно связаны с абстрактными классами, все члены которых являются абстрактными.
  • Для абстрактного класса по крайней мере один метод класса должен быть абстрактным методом, что означает, что он может иметь конкретные методы.
  •  Для интерфейса все методы должны быть абстрактными.
  • Класс, который реализует интерфейс, в значительной степени обеспечивает конкретную реализацию всех определений методов в интерфейсе, иначе должен быть объявлен абстрактный класс
  • В C# множественное наследование возможно только при реализации нескольких интерфейсов. Абстрактный класс может быть получен только один раз.
  • Интерфейс определяет контракт и может содержать только четыре сущности, а именно методы, свойства, события и индексы. Таким образом, интерфейс не может содержать константы, поля, операторы, конструкторы, деструкторы, статические конструкторы или типы.
  • Также интерфейс не может содержать статические элементы любого типа. Модификаторы abstract, public, protected, internal, private, virtual, override запрещены, так как они не имеют смысла в данном контексте.
  • Члены класса, реализующие элементы интерфейса, должны быть общедоступными.

Переопределение Резюме:

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

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

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

  • Разница между абстрактным классом и интерфейсом
  • Когда использовать абстрактный класс вместо интерфейса

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

Таблица 1: Различия между абстрактным классом и интерфейсом в Java
Абстрактный класс Интерфейс

Абстрактный класс — это класс, объявленный abstract . Он может иметь или не иметь абстрактные методы.

Интерфейс в Java неявно абстрактен, и добавление этого модификатора считается излишним и не имеет значения.

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

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

Можно объявлять неабстрактные методы абстрактного класса static , потому что для вызова неабстрактного статического метода нет необходимости создавать экземпляр класса. Конечно, метод не может быть объявлен абстрактным и статическим в абстрактном классе.

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

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

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

Абстрактные классы имеют конструкторы, и эти конструкторы всегда вызываются при создании экземпляра конкретного подкласса.

Интерфейсы не имеют конструкторов. Интерфейсы не являются частью дерева наследования объекта.

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

Все члены интерфейса по умолчанию общедоступны .

Абстрактный класс расширяется с помощью ключевого слова extends .

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

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

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

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

Когда использовать абстрактный класс: В некоторых ситуациях суперкласс не имеет прямого отношения к «вещи» в реальном мире, и поэтому мы не создаем экземпляр суперкласса. Например, все четырехколесные и двухколесные транспортные средства являются транспортными средствами, но объекта реального мира не существует, поскольку «транспортное средство» — это концептуальная сущность, которая не существует в реальном мире. В этом случае мы можем объявить абстрактный класс под названием «Автомобиль» и поместить все общие атрибуты и функции внутри этого класса. Позже мы можем создать подкласс «Автомобиль», который наследует все общие атрибуты и методы от «Автомобиля». Теперь можно создать объект класса "Автомобиль" и присвоить ему ссылку "Автомобиль".

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

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