Разница абстрактный класс интерфейс java

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

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

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

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

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

Про создание объектов интерфейсов. Ранее уже сталкивался в лекциях с моментами когда у нас есть несколько классов имплементирующих один интерфейс, и мы можем создавать объекты этих классов присваивая их переменным в типе которых присутствует название интерфейса. Например Cat и Dog реализуют интерфейс Movable, и при создании объектов этих классов мы (насколько я понимаю) можем присвоить их переменным типа: Movable animal1 и Movable animal2 Понимаю что это не есть создание объектов интерфейсов. Вопрос в следующем. Как правильно назвать это действие?) Я только что написал текста на 6 строк) Понимаю что топорно всё излагаю) помогите пожалуйста описать всё это действо P.S: Это напоминает расширение типов. Но не осмеливаюсь утверждать это, так как не до конца уверен

Читайте также:  Python requests get response body

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

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

Вот что это за «казуистика»?: Методы с реализацией Абстрактный класс может содержать методы с реализацией. Интерфейс может содержать методы по умолчанию (default methods). В чём разница по сути? Я не вижу разницы: и то, и другое реализация методов, которые можно переопределить.

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

Источник

Кофе-брейк #140. Абстрактные классы и интерфейсы в Java

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

Кофе-брейк #140. Абстрактные классы и интерфейсы в Java - 1

Источник: InfoWorld Сегодня вы узнаете, в каких случаях разработчику стоит использовать абстрактный класс, а в каких — интерфейс. Также мы определим разницу между этими элементами языка Java и выясним, как использовать их в программах. Абстрактные классы и интерфейсы достаточно распространены в коде Java и даже в самом Java Development Kit (JDK). Каждый из этих элементов служит своей цели:

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

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

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

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

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

Интерфейсы очень полезны для разделения кода и реализации полиморфизма. Мы можем это увидеть на примере в JDK с интерфейсом List :

public interface List extends Collection

Как вы, вероятно, заметили, этот код хотя и краткий, но весьма описательный. Мы можем легко увидеть сигнатуру метода, которая будет использоваться для реализации методов в интерфейсе с использованием конкретного класса. Интерфейс List содержит контракт, который можно реализовать классами ArrayList , Vector , LinkedList и другими. Чтобы использовать полиморфизм, мы можем просто объявить тип нашей переменной с помощью List , а затем выбрать любой из доступных экземпляров. Вот еще один пример:

 List list = new ArrayList(); System.out.println(list.getClass()); List list = new LinkedList(); System.out.println(list.getClass()); 

В данном случае методы реализации для ArrayList , LinkedList и Vector различаются, что является отличным сценарием для использования интерфейса. Если вы заметили, что многие классы принадлежат родительскому классу с одними и теми же действиями методов, но с разным поведением. В таких ситуациях рекомендуется использовать интерфейс. Далее давайте рассмотрим несколько вариантов применения интерфейсов.

Переопределение метода интерфейса

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

 public class OverridingDemo < public static void main(String[] args) < Challenger challenger = new JavaChallenger(); challenger.doChallenge(); >> interface Challenger < void doChallenge(); >class JavaChallenger implements Challenger < @Override public void doChallenge() < System.out.println("Challenge done!"); >> 

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

Постоянные переменные

Еще одно правило, которое следует помнить, заключается в том, что интерфейс может содержать только постоянные переменные. Вот пример:

Тут обе переменные являются неявными final и static . Это означает, что они являются константами, не зависят от экземпляра и не могут быть изменены. А теперь мы попытаемся изменить переменные в интерфейсе Challenger , скажем, вот так:

 Challenger.number = 8; Challenger.name = "Another Challenger"; 

Методы по умолчанию

Когда в Java 8 появились методы по умолчанию, некоторые разработчики думали, что они будут такими же, как абстрактные классы. Однако это не так, потому что интерфейсы не могут иметь состояние. Метод по умолчанию может иметь реализацию, а абстрактные методы — нет. Методы по умолчанию являются результатом инноваций с лямбда-выражениями и потоками, но мы должны использовать их осторожно. Метод в JDK, использующий метод по умолчанию, — это forEach() , который является частью интерфейса Iterable . Вместо того, чтобы копировать код в каждую реализацию Iterable , мы можем просто повторно использовать метод forEach :

 default void forEach(Consumer action) < // Code implementation here. 

Любая реализация Iterable может использовать метод forEach() , не требуя новой реализации метода. Затем мы можем повторно использовать код с методом по умолчанию. Давайте создадим наш собственный метод по умолчанию:

 public class DefaultMethodExample < public static void main(String[] args) < Challenger challenger = new JavaChallenger(); challenger.doChallenge(); >> class JavaChallenger implements Challenger < >interface Challenger < default void doChallenge() < System.out.println("Challenger doing a challenge!"); >> 

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

Суть абстрактного класса

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

 public abstract class AbstractClassMutation < private String name = "challenger"; public static void main(String[] args) < AbstractClassMutation abstractClassMutation = new AbstractClassImpl(); abstractClassMutation.name = "mutated challenger"; System.out.println(abstractClassMutation.name); >> class AbstractClassImpl extends AbstractClassMutation

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

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

 public abstract class AbstractMethods
 public abstract class AbstractMethods

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

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

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

  • Может иметь только конечные статические переменные. Интерфейс никогда не может изменить свое собственное состояние.
  • Класс может реализовывать несколько интерфейсов.
  • Может быть реализован с помощью ключевого слова implements. Интерфейс может расширять другой интерфейс.
  • Для методов можно использовать только статические конечные поля, параметры или локальные переменные.
  • Только функциональные интерфейсы могут использовать функцию лямбда в Java.
  • Не может иметь конструктор.
  • Может иметь абстрактные методы.
  • Может иметь методы по умолчанию и статические (представлены в Java 8).
  • Может иметь частные методы с реализацией (представлено в Java 9).
  • Могут иметь любые экземпляры или статические переменные, изменяемые или неизменяемые.
  • Класс может расширять только один абстрактный класс.
  • Могут иметь экземпляр изменяемых полей, параметров или локальных переменных.
  • Абстрактные классы только с одним абстрактным методом не могут использовать лямбда-выражения.
  • Могут иметь конструктор.
  • Могут иметь любые методы.

Источник

Оцените статью