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

 

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

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

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

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

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

Возможно, также мы добавим лошадь — животное, какое может также исполнять роль ТС. Также можно дополнить дирижабль.

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

К примеру, лошадь может быть классом в структуре системы классов животного мира.
Потенциальная реализация интерфейса могла бы смотреться так:
Теперь метод Move() определяется в интерфейсе IMovable, а определенные классы его реализуют.
Говоря об применении отвлеченных классов и интерфейсов можно привести еще такую аналогию, как состояние и действие. В основном, беспредметные классы фокусируются на общем состоянии классов-наследников.

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

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

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

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

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

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

  1. Вид методов: Интерфейс как правило имеет только беспредметные методы. Отвлеченный класс как правило имеет беспредметные и неабстрактные методы. Начав с Java 8, он также как правило имеет типовые и статические методы.
  2. Конечные переменные: переменные, объявленные в интерфейсе Java, по умолчанию окончательны. Отвлеченный класс может содержать неконечные переменные.
  3. Вид переменных: Отвлеченный класс как правило имеет конечные, не окончательные, статические и нестатические переменные. Интерфейс имеет только статические и конечные переменные.
  4. Реализация: Отвлеченный класс может обеспечить реализацию интерфейса. Интерфейс не может обеспечить реализацию отвлеченного класса.
  5. Наследование против абстракции: Java-интерфейс может быть реализован с применением основного слова «Implements», а отвлеченный класс можно расширить при помощи основного слова «extends».
  6. Множественная реализация: интерфейс может расширять только другой интерфейс Java, отвлеченный класс может расширять другой класс Java и выполнять несколько интерфейсов Java.
  7. Доступность членов данных. Члены интерфейса Java являются общедоступными по умолчанию. Отвлеченный класс Java как правило имеет такие члены класса, как private, protected и т. Д.
Разница между абстрактным классом и интерфейсом

// Java-программа для иллюстрации
// понятие отвлеченного класса
// объявляем неабстрактные методы
// имеет реализацию по умолчанию
public void moveTo( int x, int y)
System.out.println( this .objectName + " " + "has been moved to"
// беспредметные методы, которые будут
// реализовано его подклассом (ами)
abstract public double area();
abstract public void draw();
class Rectangle extends Shape
Rectangle( int length, int width, String name)
System.out.println( "Rectangle has been drawn " );
return ( double )(length*width);
class Circle extends Shape
Circle( int radius, String name)
System.out.println( "Circle has been drawn " );
return ( double )((pi*radius*radius)/ 2 );
public static void main (String[] args)
// создаём класс Object of Rectangle
// и применяя ссылку на класс формы.
Shape rect = new Rectangle( 2 , 3 , "Rectangle" );
System.out.println( "Area of rectangle: " + rect.area());
// создание объекта класса круга
Shape circle = new Circle( 2 , "Cicle" );
System.out.println( "Area of circle: " + circle.area());
Если нет у вас общего кода между прямоугольником и окружностью, тогда примените интерфейс.
Видеть это…..
// Java-программа для иллюстрации
// идея интерфейса
class Rectangle implements Shape
Rectangle( int length, int width)
System.out.println( "Rectangle has been drawn " );
return ( double )(length*width);
class Circle implements Shape
System.out.println( "Circle has been drawn " );
return ( double )((pi*radius*radius)/ 2 );
public static void main (String[] args)
// создаём класс Object of Rectangle
// и применяя ссылку на интерфейс формы.
Shape rect = new Rectangle( 2 , 3 );
System.out.println( "Area of rectangle: " + rect.area());
// создание объекта класса круга
Shape circle = new Circle( 2 );
System.out.println( "Area of circle: " + circle.area());
Когда применять что?
Рассмотрите возможность применения отвлеченных классов, если любое из данных утверждений применимо к вашей ситуации:

  • В Java-приложении есть некоторые связанные классы, которые должны вместе применять несколько строк кода, тогда вы можете поместить эти строки кода в отвлеченный класс, и этот отвлеченный класс должен быть расширен всеми данными связанными классами.
  • Вы можете определить нестатические или неконечные поля в отвлеченном классе, чтобы через метод вы могли получить доступ и поменять состояние объекта, к которому они принадлежат.
  • Можно ждать, что классы, расширяющие отвлеченный класс, имеют много общих методов или полей или просят модификаторов доступа, отличных от public (к примеру, protected и private).


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

C# — Интерфейсы (Interfaces)

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


викторина
Данная статья предоставлена Nitsdheerendra . Если вы как GeeksforGeeks и хотели бы внести собственный депозит, вы также можете написать статью при помощи contribute.geeksforgeeks.org или по почте статьи [email protected] Смотрите собственную статью, появляющуюся на главной странице GeeksforGeeks, и помогите иным вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то ошибочное или вы желаете поделиться добавочной информацией по обсуждаемой выше теме.

Отвлеченный класс и интерфейс в Java 2020

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

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

Давайте детально рассмотрим разницу между ними.

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

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

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

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

C# — ООП — Чем отличается структура от класса?

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

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

Java для начинающих. Урок 41: Абстрактные классы.

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

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

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

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

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

  1. «Множественное наследование» отвлеченного класса и интерфейса в Java — Не обращая внимания на то, что как отвлеченный класс, так и интерфейс как правило применяются для абстракции, они намного разнятся друг от друга. Хотя отвлеченный класс считается классом, интерфейс считается интерфейсом. Это значит, что тогда как интерфейс может увеличить только другой интерфейс Java, отвлеченный класс способен реализовать бесчисленные наследования в Java. Ну, Java не поддерживает бесчисленные наследования, но вполне можно осуществить бесчисленные наследования в Java.
  2. «Вид метода» отвлеченного класса и интерфейса в Java — Второе основное отличие между ними заключается в том, что, хотя интерфейс как правило имеет только беспредметные методы, отвлеченный класс как правило имеет как беспредметные, так и не беспредметные методы. Впрочем, потому как Java 8, интерфейс как правило имеет типовые и статические методы.
  3. «Модификаторы доступа» отвлеченного класса и интерфейса в Java — В отвлеченном классе могут быть общедоступные, приватные и защищенные модификаторы доступа, впрочем методы интерфейса неявно публичны и абстрактны. Вы не можете применить какой-нибудь другой модификатор доступа при помощи методов интерфейса ».
  4. «Внедрение» отвлеченного класса и интерфейса в Java — Отвлеченный класс может обеспечить реализацию интерфейса. С другой стороны, интерфейс не может обеспечить реализацию отвлеченного класса.
  5. «Главное слово» отвлеченного класса и интерфейса в Java— Хотя главное слово «абстрактное» применяется для объявления отвлеченного метода класса как отвлеченного, впрочем, интерфейсы — это полностью иная история; они могут иметь только публичные, статические конечные константы и декларации методов.
  6. «Применение» отвлеченного класса и интерфейса в Java — Хотя интерфейс замечательно подойдет для объявления типа, отвлеченный класс наиболее подходит для повторного применения кода и перспективы развития. Интерфейс смотрится как класс, однако это не класс.
  7. «Надежность» отвлеченного класса и интерфейса в Java— Еще одно значительное отличие между отвлеченным классом и интерфейсом состоит в том, что первое немного быстрее, чем последнее, из-за того что поиск в большинстве случаев связан с интерфейсом, перед тем как любой переопределенный метод вызывается в Java.
  8. «Конечные переменные» отвлеченного класса и интерфейса в Java — Переменные, объявленные в интерфейсе, по умолчанию окончательны, а отвлеченный класс может содержать или не содержать не конечные переменные.

Отвлеченный класс vs Интерфейс в Java: таблица сравнение

Отвлеченный класс Интерфейс
Абстрактное главное слово применяется для создания отвлеченного класса и он может применяться с методами. Главное слово интерфейса применяется для создания интерфейса, но оно не может применяться с методами.
Класс может распространяться исключительно на один отвлеченный класс. Класс может выполнять более одного интерфейса.
Отвлеченный класс как правило имеет как беспредметные, так и не беспредметные методы. Интерфейс как правило имеет только беспредметные методы.
По умолчанию переменные не окончательны. Он может содержать не конечные переменные. Переменные конечны по умолчанию в интерфейсе.
Отвлеченный класс может обеспечить реализацию интерфейса. Интерфейс не может обеспечить реализацию отвлеченного класса.
Он как правило имеет методы с реализациями. Он обеспечивает полную абстракцию и не как правило имеет реализации метода.
Он как правило имеет модификаторы public, private, static и protected access. Такие способы неявно публичны и абстрактны в интерфейсе Java.
Он не поддерживает бесчисленные наследования. Он поддерживает бесчисленные наследования.
Он замечательно подойдет для повторного применения кода и эволюции. Он прекрасен для объявления типа.

Небольшой обзор отвлеченного класса и интерфейса в Java

Оба абстракции класса и интерфейса применяются для абстракции; но они имеют собственную долю различий. Главное отличие между ними вызвано методами абстракции.

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

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

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

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

25 Ответов

Межфазные границы

Интерфейс — это договор : человек, пишущий интерфейс, говорит: "Эй, я принимаю вещи, которые смотрятся конкретно так", а человек, использующий интерфейс, говорит: "OK, класс, который я пишу, смотрится конкретно так".
Интерфейс — это пустой shell . Есть только сигнатуры методов, что означает, что методы не имеют тела. Интерфейс ничего не способен выполнить.

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

 

Отвлеченный класс

Беспредметные классы, в отличии от интерфейсов, являются классами. Они намного дорогие в применении, из-за того что есть поиск, чтобы выполнить, когда вы наследуете от них.
Беспредметные классы аналогичные на интерфейсы, однако у них есть что то большее: вы можете определить поведение для них. Это больше похоже на то, как человек говорит: "эти классы должны смотреться так, и есть у них это общее, благодаря этому заполните пробелы!".

Реализация

Хотя беспредметные классы и интерфейсы обязаны быть разнообразными тезисами, реализации выполняют это заявление иногда неверным. Иногда они даже не такие, как вы думаете.
В Java данное правило неукоснительно выполняется, тогда как в PHP интерфейсы являются отвлеченными классами без объявления метода.
В Python беспредметные классы-это скорее прием программирования, который вы скорее всего получите из модуля ABC и практически применяете метаклассы, а значит, и классы. И интерфейсы в большей степени связаны с типизацией утки на этом языке, и это смесь между соглашениями и специализированными методами, которые вызывают дескрипторы (__method__ methods).
Как в большинстве случаев с программированием, есть доктрина, практика и практика на другом языке 🙂
Ключевые технические отличия между отвлеченным классом и интерфейсом заключаются в следующем:
Беспредметные классы могут иметь константы, члены, заглушки методов (методы без тела) и конкретные методы , тогда как интерфейсы могут иметь только константы и заглушки методов .
Методы и члены отвлеченного класса могут быть установлены с любой видимостью, тогда как все методы интерфейса обязаны быть установлены как public (они установлены публично по умолчанию).
При наследовании отвлеченного класса определенный дочерний класс должен определить беспредметные методы, тогда как отвлеченный класс может увеличить другой отвлеченный класс, и беспредметные методы из родительского класса не обязаны быть установлены.
Подобно, интерфейс, расширяющий другой интерфейс, не несет ответственности за реализацию методов из родительского интерфейса. Это происходит благодаря тому, что интерфейсы не могут определить какую-либо реализацию.
Дочерний класс может увеличить всего один класс (отвлеченный или определенный), тогда как интерфейс может увеличить или класс может осуществить несколько иных интерфейсов .
Дочерний класс может определять беспредметные методы с той же или менее ограниченной видимостью , тогда как класс, реализующий интерфейс, должен определять методы с аналогичный видимостью (public).
Интерфейс содержит только обозначение / сигнатуру функциональности, и если у нас есть некоторая общая функциональность, и еще общие сигнатуры, то нам необходимо применять отвлеченный класс. Применяя отвлеченный класс, мы можем обеспечить поведение и функциональность одновременно.

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

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

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

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

Обозначение интерфейса состоит из сигнатур открытых членов, без какого-то кода реализации.

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

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

1.Main отличие заключается в том, что методы интерфейса Java неявно абстрактны и не могут иметь реализаций. Отвлеченный класс Java может имейте методы экземпляра, которые реализуют поведение по умолчанию.
2.Variables, объявленный в интерфейсе Java, по умолчанию окончателен. Отвлеченный класс может содержать не конечные переменные.
3.Members интерфейса Java являются открытыми по умолчанию. Отвлеченный класс Java как правило имеет традиционные предпочтения членов класса, например private, защищены и т. д..
Интерфейс 4.Java должен быть реализован с применением основного слова “implements”; отвлеченный класс Java должен быть расширен при помощи основного слова “extends”.
Интерфейс 5.An может увеличить только другой интерфейс Java, отвлеченный класс может увеличить другой класс Java и осуществить несколько Java межфазные границы.
Класс 6.A Java способен реализовать несколько интерфейсов, однако он может увеличить всего один отвлеченный класс.
7.Interface совершенно абстрактен и не может быть создан; отвлеченный класс Java также не может быть создан, но может быть вызван, если a main() есть.
8.In если сравнивать с java отвлеченными классами, java интерфейсы работают неторопливо, так как это требует добавочной косвенности.

Я не хочу выделять различия, о которых мы говорили во многих ответах ( относительно общественных статических конечных модификаторов для переменных в интерфейсе & поддержка защищенных, приватных методов в отвлеченных классах)
Говоря проще, я желал бы сказать::
интерфейс: для реализации договора несколькими несвязанными объектами
отвлеченный класс: для реализации одного и того же или разного поведения между несколькими связанными объектами
Рассмотрите возможность применения отвлеченных классов , если :

  1. Вы желаете поделить код между несколькими тесно связанными классами.
  2. Предполагается, что классы, расширяющие отвлеченный класс, имеют много общих методов или полей или просят модификаторов доступа, отличных от public (к примеру, protected и private).
  3. Вы желаете объявить нестатические или неокончательные поля.


Рассмотрите возможность применения интерфейсов , если :

  1. Вы ожидаете, что несвязанные классы будут выполнять ваш интерфейс. К примеру, многие несвязанные объекты могут осуществить интерфейс Serializable .
  2. Вы желаете показать поведение определенного типа данных, однако не заботитесь о том, кто реализует его поведение.
  3. Вы желаете воспользоваться хорошими качествами множественного наследования типа.


отвлеченный класс устанавливает отношение "is a" с определенными классами. интерфейс дает прекрасную возможность "has a" для классов.
Если вы хотите найти Java как язык программирования, вот еще несколько обновлений:
Java 8 в определенной степени сократил разрыв между классами interface и abstract , предоставив функцию метода default . Интерфейс, не имеющий реализации для метода , теперь недействителен.
Дополнительные сведения см. На данной странице документации.
Посмотрите на данный вопрос SE для лучшего понимания примеров кода.
Главное состоит в том, что:

  • Абстрактное-объектно-ориентированное . Он предлагает ключевые данные, которые обязан иметь ‘object’ и / или функции, которые он должен уметь исполнять. Он связан с важными характеристиками объекта: что он имеет и что он может делать. Стало быть, объекты, наследуемые от одного и того же отвлеченного класса, имеют общие основные характеристики (обобщение).
  • Интерфейс направлен на функциональность . Он определяет возможности в работе, которые обязан иметь объект. независимо от того, что это за объект, пока он как правило выполняет данные функции, которые установлены в интерфейсе, это хорошо. Он игнорирует все другое. Объект / класс может содержать несколько (групп) практичных возможностей; стало быть, класс способен реализовать несколько интерфейсов.


Я строю здание в 300 этажей
Интерфейс чертежа строения
Здание выстроено до 200 этажей-частично окончено — — — аннотация

  • Неполная реализация, к примеру, generic и сервлет HTTP


Возведение здания окончено-бетон

  • Полная реализация, к примеру, своего сервлета

  • Мы ничего не знаем о реализации, только требования. Можно переходить к интерфейсу.
  • Каждый метод считается открытым и отвлеченным по умолчанию
  • Это 100% чисто отвлеченный класс
  • Если мы объявляем себя публичными мы не можем объявить себя приватными и защищенными
  • Если мы объявляем абстрактное, мы не можем объявить конечное, статическое, синхронизированное, строгое и свое
  • Каждый интерфейс имеет публичный, статический и конечный
  • Сериализация и процесс перехода непригодны, из-за того что мы не можем создать экземпляр для in interface
  • Нелетучий, из-за того что он конечный
  • Каждая переменная считается статической
  • Когда мы объявляем переменную в середине интерфейса нам необходимо инициализировать переменные во время объявления
  • Экземпляр и статический блок не допускаются

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


Если у вас есть желание обеспечить полиморфное поведение в иерархии наследования, примените беспредметные классы.
Если у вас есть желание получить полиморфное поведение для классов, которые абсолютно не связаны, примените интерфейс.
Давайте еще раз поработаем над данным вопросом:
Первое, что вы обязаны знать, это то, что 1/1 и 1*1 приводят к одному и тому же, но это не значит, что умножение и дробление такие же. Понятно, что они поддерживают хорошие отношения, но помните, что вы оба различные.
Я укажу на важные отличия, и rest уже были объяснены:
Беспредметные классы полезны для моделирования иерархии классов. С первого взгляда любого требования, мы частично ясно понимаем, что собственно должно быть выстроено, но мы знаем, что строить.

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

Интерфейсы будут помечать его как обязательный для класса, чтобы осуществить такие же функции.
В действительности все достаточно легко.
Вы можете думать об интерфейсе как о классе, который как правило имеет только беспредметные методы и ничего больше.
Аналогичным образом, интерфейс может лишь "declare" и не определять поведение, которое вы желаете, чтобы класс имел.
Отвлеченный класс дает возможность вам как объявлять (применяя беспредметные методы), так и определять (применяя полные реализации методов) поведение, которое вы желаете, чтобы класс имел.
А традиционный класс дает возможность лишь определять, а не объявлять поведение/действия, которые вы желаете, чтобы класс имел.
В Java можно осуществить несколько интерфейсов, но вполне можно увеличить всего один (отвлеченный класс или класс).
Это значит, что наследование конкретного поведения ограничено только разрешением одного на класс. т. е. если вам необходим класс, который инкапсулирует поведение из классов A,B&C, вам потребуется выполнить следующее: класс A расширяет B, класс C расширяет A .. это немного круглый способ иметь множественное наследование.
Интерфейсы с другой стороны, вы могли бы просто смастерить: интерфейс C реализует A, B
Аналогичным образом, на самом деле Java поддерживает множественное наследование только в интерфейсах "declared behavior" ie, и лишь одно наследование с конкретным поведением.. если конечно вы не сделаете все так, как я описал.
Сравнение интерфейса с отвлеченным классом ошибочно. Заместо этого обязаны быть два иных сравнение: 1) интерфейс против класса и 2) отвлеченный против конечного класса .

Интерфейс vs класс

Интерфейс -это договор между 2-мя объектами. E.g.- Я Postman, а ты-посылка для доставки.

Я надеюсь, что вы знаете собственный адрес доставки. Когда кто-то даёт мне посылку, он обязан знать ее адрес доставки:
Класс -это группа объектов, которые подчиняются договору. E.g., Я-ящик из группы "Box", и я подчиняюсь договору, требуемому Postman. В то же время я подчиняюсь иным договорам:

Аннотация против окончательного

Отвлеченный класс — это группа неполных объектов. Они не используют, из-за того что они пропускают некоторые части. E.g., Я отвлеченный GPS-осведомленный ящик — я знаю, как проверить собственное положение на карте:
Этот класс, если он наследуется или становится шире иным классом, может быть предельно полезен. Но само по себе-оно бесполезно, так как не как правило имеет объектов.

Беспредметные классы могут быть элементами построения конечных классов.
Конечный класс — это группа законченных объектов, которые можно применять, однако нельзя менять. Они наверняка знают, как работать и что сделать. E.g., Я-ящик, который всегда идет по адресу, указанному при его постройке:
В большинстве языков, например как Java или C++, можно иметь только класс , ни отвлеченный, ни конечный. Такой класс можно наследовать и создавать экземпляры.

Впрочем я не думаю, что это строго отвечает объектно-ориентированной парадигме.
Снова же, сравнение интерфейсов с отвлеченными классами не очень правильно.
Отличие только в том, что один может принимать участие в множественном наследовании, а другой-нет.
Обозначение интерфейса поменялось со временем. Вы думаете, что интерфейс просто имеет только объявления методов и считается только лишь договорами? Как насчет статических конечных переменных и определений по умолчанию после Java 8?
Интерфейсы были введены в Java из- за алмазной проблемы с множественным наследованием, и собственно это они в действительности намерены сделать.
Интерфейсы-это конструкции, которые были созданы, во избежание проблемы множественного наследования и могут иметь беспредметные методы, определения по умолчанию и статические конечные переменные.
Другими словами различия заключаются в следующем:
Синтаксические отличия между интерфейсом и отвлеченным классом :

  1. Методы и члены отвлеченного класса могут иметь любую видимость. Все методы интерфейса обязаны быть общедоступными . //Does больше не отвечает реальности от Java 9
  2. Определенный дочерний класс отвлеченного класса должен определять все беспредметные методы. Отвлеченный дочерний класс как правило имеет беспредметные методы. Интерфейс, расширяющий другой интерфейс, не должен обеспечивать реализацию по умолчанию для методов, унаследованных от родительского интерфейса.
  3. Дочерний класс может расширять всего один класс. Интерфейс может расширять несколько интерфейсов. Класс способен реализовать несколько интерфейсов.
  4. Дочерний класс может определять беспредметные методы с такой же или менее ограниченной видимостью, тогда как класс, реализующий интерфейс , должен определять все методы интерфейса как открытые.
  5. Беспредметные классы могут иметь конструктора, однако не интерфейсы .
  6. Интерфейсы из Java 9 имеют приватные статические методы.


public static -поддерживается
public abstract -поддерживается
public default -поддерживается
private static -поддерживается
private abstract -ошибка компиляции
private default -ошибка компиляции
private -поддерживается
Интерфейс: Поворот (Поворот Налево, Поворот Направо.)
Класс: рулевое колесо, производное от колеса, открывает интерфейс поворота
Одна из них нужна для категоризации поведения, какое может быть предложено в различных вещах, а другая-для моделирования онтологии вещей.
Если у вас есть некоторые общие методы, которые используют несколькими классами, перейдите к отвлеченным классам. В другом случае, если у вас есть желание, чтобы классы шли какой-то конкретной схеме, перейдите к интерфейсам.
Следующие варианты показывают это.
Ниже приведена реализация интерфейса в Java:
Определенные важные главные нюансы кратко:
Переменные, объявленные в интерфейсе Java, по умолчанию окончательны. Беспредметные классы могут иметь не конечные переменные.
Переменные, объявленные в интерфейсе Java, по умолчанию являются статическими. Беспредметные классы могут иметь нестатические переменные.
Члены интерфейса Java по умолчанию являются открытыми. Отвлеченный класс Java как правило имеет традиционные предпочтения членов класса, например private, protected и т. д..
В действительности это не ответ на первый вопрос, но как лишь вы получите ответ на разницу между ними, вы войдете в задачу when-to-use-each: Когда необходимо применять интерфейсы или беспредметные классы? Когда применять два варианта?
Я ограничил собственные знания о OOP, но видеть интерфейсы как эквивалент прилагательного в grammar работало для меня до этого времени (поправьте меня, если данный метод поддельный!). К примеру, имена интерфейсов подобны атрибутам или возможностям, которые вы можете дать классу, и класс как правило имеет их много: ISerializable, ICountable, IList, ICacheable, IHappy, .
Наследование применяется для 2-ух целей:
Чтобы разрешить объекту рассматривать детали данных родительского типа и реализации методов как собственные.
Разрешить применение ссылки на объекты однотипны в коде, который ждет ссылку на объект супертайпа.
В языках / фреймворках, поддерживающих обобщенное множественное наследование, часто нет надобности обозначать вид как "interface" или "abstract class". Впрочем распространенные языки и фреймворки дают возможность типу рассматривать детали данных или реализации методов иного типа как собственные, даже в том случае, если они дают возможность типу быть заменяемым для произвольного числа остальных типов.
Беспредметные классы могут иметь детали данных и реализации методов, но могут быть унаследованы только классами, которые не наследуют от прочих классов. Интерфейсы практически не накладуют ограничений на типы, которые их реализуют, однако не могут включать никаких элементов данных или реализаций методов.
Нередки моменты, когда полезно, чтобы типы были заменяемы для большинства различных вещей; бывают и прочие моменты, когда полезно, чтобы объекты разглядывали детали данных родительского типа и реализации методов как собственные. Проведение отличия между интерфейсами и отвлеченными классами дает возможность применять любую из этих способностей в том случае, когда она более актуальна.
По определению, интерфейсы не могут иметь реализацию для любых методов, а переменные-члены не могут быть инициализированы.
Впрочем беспредметные классы могут иметь реализованные методы и инициализированные переменные-члены.
Примените беспредметные классы, когда вы ожидаете изменений в вашем договоре, другими словами, скажем, в дальнейшем вам будет не лишним добавить новый метод.
В данной ситуации, если Вы захотите применять интерфейс, когда интерфейс будет изменен на include interface, ваше приложение поломается, когда вы сбросили новый интерфейс dll.

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

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


Очень короткий способ подвести итог заключается в том, что interface -это:

  1. Полностью отвлеченный, не считая методов default и static ; хотя он имеет определения (сигнатуры методов + реализации) для методов default и static , он имеет только объявления (сигнатуры методов) для остальных методов.
  2. Подчиняется очень мягким правилам, чем классы (класс способен реализовать несколько interface s, а interface может наследовать от нескольких interface s). Все переменные являются неявно регулярными, независимо от того, указаны ли они как public static final либо нет. Все члены являются неявно public , независимо от того, указаны они как таковые либо нет.
  3. В большинстве случаев применяется как гарантия того, что реализующий класс станет иметь указанные функции и/или будет совместим с любым остальным классом, который реализует тот же интерфейс.


Между тем, класс abstract считается:

  1. В любых местах от полностью отвлеченного до полностью реализованного, с тенденцией иметь один или несколько методов abstract . Может содержать как объявления, так и определения, причем объявления помечены как abstract .
  2. Настоящий класс, подчиняющийся правилам, которые управляют иными классами (может наследовать всего один класс), при условиях, что он не может быть создан (из-за того что нет никакой гарантии, что он полностью реализован). Как правило имеет непостоянные переменные-члены. Может выполнять управление доступом членов, ограничивая членов как protected , private или приватный пакет (не отмечено).
  3. В большинстве случаев применяется или для предоставления такой части реализации, которая может быть вместе потреблена несколькими подклассами, или для предоставления такой части реализации, которую может предъявить программист.


Или, если мы хотим свести все это к одному предложению: interface -это то , что есть у реализующего класса , но класс abstract -это то, что есть подкласс .
Я желал бы добавить еще одно отличие, которое целесообразно. Допустим, у вас есть фреймворк с тысячами строк кода. Теперь, если у вас есть желание добавить новую функцию по всему коду, применяя метод enhanceUI(), то лучше добавить данный метод в отвлеченном классе, а не в интерфейсе.

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

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


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

Похожие вопросы:

Как говорят в наименовании. В чем разница между интерфейсом и отвлеченным интерфейсом в Java?
Потенциальный Дубликат : Когда применять интерфейс заместо отвлеченного класса и наоборот? Разница между интерфейсом, отвлеченным классом, запечатанным классом, статическим классом и частичным классом.
Разница между интерфейсом, отвлеченным классом, запечатанным классом, статическим классом и частичным классом в c#?, если все классы доступны в vb.net?
Потенциальный Дубликат : Интерфейс против базового класса Я не понимаю разницы между отвлеченным классом и интерфейсом. Когда мне необходимо применять какое искусство типа?
В чем разница между отвлеченным классом и интерфейсом с точки зрения их хранения в JVM. Чтобы быть намного точнее, где JVM хранит интерфейсы в собственной памяти?
Не так давно я столкнулся с чертами характера в PHP и пытаюсь понять их. Во время моего исследования я наткнулся на данный вопрос переполнения стека: линии против интерфейсов . В принятом ответе говорится.
Потенциальный Дубликат : В чем разница между интерфейсом и отвлеченным классом? В чем разница между интерфейсом и отвлеченным классом в Java?

Почему я хочу применять один над иным?
Потенциальный Дубликат : Интерфейс vs отвлеченный класс (general OO ) Могу ли я когда-либо создать экземпляр отвлеченного класса? Если да, то отчего же мне не все сделать мои незапечатанные классы.
В чем разница между отвлеченным классом и интерфейсом в Python?
Потенциальный Дубликат : PHP: в чем разница между интерфейсом и отвлеченным классом? здравствуй, парни.. Насколько я понимаю, класс clase реализует или расширяет отвлеченный или интерфейсный класс должен.

ООП. Часть 6. Беспредметные классы и интерфейсы

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

Беспредметные классы

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

У них могут быть одинаковые свойства (имя, координаты) и методы (перемещение, изменение анимации).

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

Пишет о программировании, в свободное время создаёт игры. Мечтает открыть собственную студию и отпускать ламповые RPG.
Чтобы не повторить код несколько раз, можно вынести реализацию таких параметров и методов в отвлеченный класс Character:
Здесь всё как у обыкновенных классов, но в конце можно заметить объявление свойства и метода без реализации. Реализация таких отвлеченных параметров должна быть в дочернем классе:
Когда объявляется реализация такого члена класса, достаточно указать главное слово override. Отвлеченными могут быть следующие члены класса:
Дочерний класс должен выполнять все члены родительского отвлеченного класса, не считая тех случаев, когда дочерний класс тоже отвлеченный.
В остальном все достаточно схоже на традиционные классы. К примеру, поле Y класса Character публичное, чтобы можно было применять его в свойстве Y дочерних классов.

Отвлеченный класс должен быть публичным.

 

Рекомендованные статьи

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

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