Чем отличается интерфейс от абстрактного класса java
Перейти к содержимому

Чем отличается интерфейс от абстрактного класса java

  • автор:

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

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

Класс, в объявлении которого есть ключевое слово абстрактное, называется абстрактным классом. Абстрактные классы должны иметь ноль или более абстрактных методов. т.е. методы без тела. Он может иметь несколько конкретных методов.

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

Абстрактные классы не могут быть созданы.

Важные причины использования интерфейсов

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

Важные причины использования абстрактного класса

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

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

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

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

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

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

параметры Интерфейс Абстрактный класс
Скорость Замедлять Быстрый
Множественное наследство Реализуйте несколько интерфейсов Только один абстрактный класс
Структура Абстрактные методы Абстрактные и конкретные методы
Когда использовать Будущее улучшение Чтобы избежать независимости
Наследование/реализация Класс может реализовывать несколько интерфейсов Класс может наследовать только один абстрактный класс.
Реализация по умолчанию При добавлении новых элементов в интерфейс сложно найти всех разработчиков и реализовать новые определенные элементы. В случае абстрактного класса вы можете воспользоваться реализацией по умолчанию.
Модификаторы доступа Интерфейс не имеет модификаторов доступа. Все, что определено внутри интерфейса, считается общедоступным модификатором. Абстрактный класс может иметь модификатор доступа.
Когда использовать Лучше использовать интерфейс, когда различные реализации используют только сигнатуру метода. Полиморфная иерархия типов значений. Его следует использовать, когда различные реализации одного и того же типа имеют общее поведение.
Поля данных интерфейс не может содержать поля данных. класс может иметь поля данных.
Множественное наследование по умолчанию Класс может реализовывать множество интерфейсов. Класс наследует только один абстрактный класс.
Реализация Интерфейс является абстрактным, поэтому он не может предоставлять никакого кода. Абстрактный класс может предоставлять полный код по умолчанию, который следует переопределить.
Использование модификаторов доступа Вы не можете использовать модификаторы доступа для метода, свойств и т. д. Вы можете использовать абстрактный класс, содержащий модификаторы доступа.
Применение Интерфейсы помогают определить периферийные возможности класса. Абстрактный класс определяет идентичность класса.
Определенные поля Поля не могут быть определены Абстрактный класс позволяет определять как поля, так и константы.
наследование Интерфейс может наследовать несколько интерфейсов, но не может наследовать класс. Абстрактный класс может наследовать класс и несколько интерфейсов.
Конструктор или деструкторы Интерфейс не может объявлять конструкторы или деструкторы. Абстрактный класс может объявлять конструкторы и деструкторы.
Ограничение расширений Он может расширять любое количество интерфейсов. Одновременно он может расширять только один класс или один абстрактный класс.
Абстрактное ключевое слово В ключевом слове абстрактного интерфейса необязательно объявлять метод как абстрактный. В абстрактном классе ключевое слово Abstract является обязательным для объявления метода как абстрактного.
Тип класса Интерфейс может иметь только публичные абстрактные методы. У абстрактного класса есть защищенные и общедоступные абстрактные методы.

Пример кода для интерфейса и абстрактного класса в Java

Фоллоwing это пример кода для создания интерфейса и абстрактного класса в Java

Синтаксис интерфейса

interface name< //methods >

Пример Java-интерфейса:

interface Pet < public void test(); >class Dog implements Pet < public void test() < System.out.println("Interface Method Implemented"); >public static void main(String args[]) < Pet p = new Dog(); p.test(); >>

Синтаксис абстрактного класса

abstract class name< // code >

Пример абстрактного класса:

abstract class Shape < int b = 20; abstract public void calculateArea(); >public class Rectangle extends Shape < public static void main(String args[]) < Rectangle obj = new Rectangle(); obj.b = 200; obj.calculateArea(); >public void calculateArea() < System.out.println("Area is " + (b * b)); >>
  • Java-программа для проверки простого числа
  • Как перевернуть строку в Java с помощью рекурсии
  • Программа чисел-палиндромов на Java с использованием цикла while и for
  • Алгоритм пузырьковой сортировки на Java: программа и пример сортировки массива
  • Алгоритм сортировки вставками в Java с примером программы
  • Сортировка выбором в программе Java с примером
  • 100+ вопросов и ответов на собеседовании по Java (2024 г.)
  • Учебное пособие по JAVA в формате PDF: основы для начинающих (загрузить сейчас)

Чем отличается интерфейс от абстрактного класса java

Говорили, что будет понятно, почему InputStream и OutputStream — это по сути интерфейсы, но все-же абстрактные классы. Обманули?

Alex Уровень 27
2 января 2024
И каждый раз, когда я уходил от тебя, ты снова возвращалась ��
Максим Li Уровень 36
12 ноября 2023
ElenaN Уровень 37
28 октября 2023

Вроде статья начиналась как статья про абстрактные классы и интерфейсы, а потом вдруг — а, кстати, помните пару уровней назад вы ничего не поняли про I/O? вот, держите!

Василь Уровень 25
25 октября 2023
мені одному здалося що стаття більше про ріадери, а не про абстрактні класи та інтерфейси?
Александра 😉 Уровень 32
6 сентября 2023

Всем привет!! Изучая Java, в очередной раз осознала нехватку живого общения с единомышленниками =). Вот и решила создать группу в телеграмм, где Java — студенты смогут не только обсуждать вопросы по изучению Java, но и организовывать живые встречи. Кому интересно, вступайте =) https://t.me/JavaCommunityMoscow

Dmitry Vidonov Уровень 29 Expert
4 сентября 2023
Молодец Aditi! Продуктивная бабца!
chess.rekrut Уровень 25
22 августа 2023
Rustam Уровень 35 Student
31 июля 2023
начал понимать суть интерфейсов, спасибо
Alexander Rozenberg Уровень 32
25 июля 2023
Сообщество

JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.

Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2024 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2024 JavaRush

Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.

Абстрактные классы в Java и их отличия от интерфейсов: кратко и без воды

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

Иллюстрация: Dana Moskvina / Skillbox Media

Паша Лебедев

Паша Лебедев
Пишет на Java. Верит в Agile. Пьёт много кофе и не любит грязный код.

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

Представим, что нам нужно описать несколько животных — и у каждого будет свой класс. Мы соберём их характеристики, опишем в полях и методах. У некоторых животных характеристики будут совпадать — например, и у гепарда, и у коня 4 ноги. А у некоторых — не совпадут: кролик ест траву, а тигр — других животных.

Однако, несмотря на несовпадение, мы можем выделить шаблонные характеристики: количество лап, издаваемый звук, приём пищи, передвижение. Эти шаблонные характеристики мы можем собрать в одном месте — абстрактном классе «Животное» и указать компилятору, что наполним их конкретными данными и поведением позже — в классах отдельных животных или групп животных.

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

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

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

Давайте рассмотрим пример абстрактного класса в Java.

public abstract class Animal < Integer countOfLegs; Double weight; String color; public abstract void run( ); public void eat( ) < System.out.println("Animal says nyam-nyam"); > >

Как вы видите, абстрактный класс очень похож на обычный класс. Чтобы сделать класс абстрактным, нам нужно добавить ключевое слово abstract в описание класса и в методы, которые мы хотим оставить абстрактными, — то есть определить уже в конкретных классах (медведь, лиса, лягушка).

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

Именно так мы и сделали в примере выше: добавили переменные для веса, цвета и количества ног у животного, а также описали два метода: run («бежать») и eat («кушать»). В нашем случае метод run — абстрактный, а у метода eat есть реализация по умолчанию. Это значит, что в классах, которые наследуют от Animal, мы обязаны добавить определение метода run, а переопределять или нет метод eat, зависит от наших задач и желания.

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

public class Dog extends Animal < @Override public void run() < System.out.println("Dog says gaf-gaf"); > >

Здесь extends Animal означает, что мы наследуем класс Animal. Как только мы создадим пустой класс Dog, компилятор сразу подсветит его красным и выведет такое сообщение:

Error: (3, 8) java: com.company.Dog is not abstract and does not override abstract method run () in com.company.Animal

Это значит, что мы обязаны переопределить метод run() — что мы и сделали с помощью аннотации @Override.

Теперь давайте создадим объект класса Dog. Как мы видим, после его создания нам доступны все переменные и методы из класса Animal. Попробуем вызвать eat и run.

public static void main(String[] args) < Dog scooby = new Dog(); scooby.eat(); scooby.run(); >

Вот что мы увидим в консоли:

Animal says nyam-nyam

Dog says gaf-gaf

Итак, давайте выделим важные моменты:

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

Больше рецептов на Java — в нашей базе знаний.

Отличия абстрактного класса и интерфейса

На собеседованиях часто задают вопрос, чем отличаются абстрактные классы и интерфейсы. Вот их основные отличия:

  • Интерфейсы описывают только часть функциональности объекта — определённые признаки. Абстрактный класс же может описывать целую категорию разных объектов, а его характеристики имеют право наследовать только те объекты, которые являются частью этой категории. Например, собаки и волки — часть общей категории «Животные», а интерфейс, описывающий умение бегать, может реализовать и человек, и робот, и собака.
  • Интерфейс описывает только поведение (методы), и у него нет полей. Точнее, есть возможность их объявить, но они будут public static final. В то же время абстрактный класс может содержать классические поля, которые будут принадлежать разным объектам.
  • Наследник абстрактного класса обязан наследовать все его составляющие, а интерфейс создан только для реализации (имплементирования). Поэтому в Java мы можем наследовать класс только от одного класса, а на реализацию интерфейсов внутри одного класса ограничений нет.

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

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

Когда лучше использовать абстрактные классы:

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

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

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

Это лишь базовые и самые распространённые ситуации. Решая конкретные задачи, лучше советоваться с более опытными разработчиками или принимать самостоятельное решение.

Заключение

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

Читайте также:

  • Что такое класс в Java
  • Как разработчик на C++ превратил свой пет-проект в прибыльный стартап
  • Основные принципы ООП: большой гайд по объектно-ориентированному программированию

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

— Привет, Амиго! Билаабо расскажет тебе о различиях абстрактного класса и интерфейса. Их несколько.

Абстрактный класс Интерфейс
Наследование
Абстрактный класс может унаследоваться только от одного класса и любого количества интерфейсов . Интерфейс не может наследоваться от классов , но может от любого количества интерфейсов .
Абстрактные методы
Абстрактный класс может содержать абстрактные методы . Но может и не содержать их вообще. Все не статические и не default методы интерфейса – абстрактные – не содержат реализации. Интерфейс может не содержать никаких методов вообще.
Методы с реализацией
Абстрактный класс может содержать методы с реализацией . Интерфейс может содержать методы по умолчанию (default methods).
Данные
Никаких ограничений. Интерфейс содержит только public final static данные.
Создание объекта
Нельзя создать объект абстрактного класса. Нельзя создать объект интерфейса.

— Вот это я понимаю. Кратко и по существу.

Java-университет

Комментарии (300)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #2277416 Уровень 13
1 января 2024

Интерфейс содержит только public final static данные. Все переменные в интерфейсах неявно являются public static final (т.е. константами). Методы в интерфейсах могут быть private, если они имеют реализацию. Источник (рекомендую): Различия между абстрактными классами и интерфейсами в Java

JavaPure Уровень 23
12 декабря 2023
А где более продвинутый паскаль?
Максим Li Уровень 36
12 ноября 2023
Edf Уровень 28
8 ноября 2023

все вроде ясно, один момент не понятен — кто такой Билаабо? Что такая короткая лекция? Он на пол-ставки штоле? И куда делся первый кореш Диего?

M10beretta Уровень 27
7 октября 2023

 Различия между абстрактным классом и интерфейсом (Java 9+) часть 1 из 2-x 1 Ключевое слово создания abstract | interface 2 Расширение extends может расширить 1 класс | может расширить 65535 интерфейсов (в том числе абстрактный) расширяется классом | расширяется интерфейсом (в том числе абстрактным) 3 Реализация implements может реализовать | не реализует 65535 интерфейсов не реализуется | реализуется классом (в том числе абстрактным) класс (в том числе абстрактный) может реализовать 65535 интерфейсов 4 Видимость полей и методов по умолчанию в пределах пакета | без ограничений 5 Поля без ограничений | public static final (все) 6 Блоки инициализации без ограничений | запрещен 7 Конструктор без ограничений | запрещен 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *