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

Автор: Laura McKinney
Дата создания: 1 Апрель 2021
Дата обновления: 11 Май 2024
Anonim
Разница между интерфейсом и абстрактным классом в Java & C # - Технология
Разница между интерфейсом и абстрактным классом в Java & C # - Технология

Содержание


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

  1. Сравнительная таблица
  2. Определение
  3. Ключевые отличия
  4. Заключение

Сравнительная таблица

Основа для сравненияИнтерфейсАбстрактный класс
основнойКогда вам известно только о требованиях, а не о его реализации, вы используете «Интерфейс».Когда вы частично знаете о реализациях, вы используете «Абстрактные классы».
методыИнтерфейс содержит только абстрактные методы.Абстрактный класс содержит абстрактные методы, а также конкретные методы.
Модификатор доступа к методамМетоды интерфейса всегда "Public" и "Abstract", даже если мы не объявляем. Следовательно, это можно сказать как 100%, чистый абстрактный класс.Не обязательно, чтобы метод в абстрактном классе был публичным и абстрактным. У него могут быть и конкретные методы.
Ограниченный модификатор для методовМетод интерфейса не может быть объявлен со следующими модификаторами:
Государственный: частный и охраняемый
Аннотация: финальная, статическая, синхронизированная, нативная, строгая.
Нет никаких ограничений на модификаторы абстрактной переменной класса.
Модификатор доступа к переменнымМодификатор Acess, разрешенный для переменных интерфейса, является общедоступным, статическим и окончательным независимо от того, декларируем мы или нет.Переменные в абстрактном классе не обязательно должны быть public, static, final.
Ограниченные модификаторы для переменныхПеременные интерфейса не могут быть объявлены как частные, защищенные, временные, изменчивые.Нет ограничений на модификаторы переменных абстрактного класса.
Инициализация переменныхПеременные интерфейса должны быть инициализированы во время их объявления.Не обязательно, чтобы переменные абстрактного класса были инициализированы во время его объявления.
Экземпляр и статические блокиВнутри интерфейса вы не можете объявить экземпляр или статический блок.Абстрактный класс допускает экземпляр или статический блок внутри него.
КонструкторыВы не можете объявить конструктор внутри интерфейса.Вы можете объявить конструктор внутри абстрактного класса.


Определение интерфейса

Java не разрешает множественное наследование. То есть один класс не может наследовать более одного класса одновременно. Причину этого можно объяснить на примере. Предположим, у нас есть два родительских класса, A и B, и производный класс C. Производный класс C наследует классы A и B.Теперь оба имеют класс A и B имеют метод set (), тогда для класса C будет вопрос, какой метод set () класса должен наследовать. Решением этой проблемы является «интерфейс».

Интерфейс - это чистый абстрактный класс. Ключевое слово, используемое для создания интерфейса - «интерфейс». Поскольку все методы внутри интерфейса полностью абстрактны. Интерфейс только определяет, что должен делать класс, но не определяет, как он это делает. Только потому, что все методы, объявленные внутри интерфейса, являются абстрактными, для интерфейса не создается экземпляр. Общая форма «интерфейса» в Java:


access_specifier интерфейс имя_интерфейса {имя-метода-возврата1 (список параметров); возвращаемый метод method-name2 (список параметров); тип final-varname1 = значение; тип final-varname2 = значение; // ... возвращаемый тип method-nameN (параметр-список); тип final-varnameN = значение; }

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

У нас нет понятия «интерфейс» в C ++. Но Java и C # определяют интерфейс очень хорошо.

Интерфейс в Java:

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

Общая форма реализации интерфейса в Java:

class class_name реализует Interface_name {// class-body}

Для наследования интерфейса класс использует ключевое слово «Implements», а класс реализует весь метод, объявленный унаследованным интерфейсом.

Интерфейс в C #:

Интерфейс в C # почти аналогичен интерфейсу в Java за исключением:

  • Интерфейс в C # не объявляет переменные.
  • Имя интерфейса начинается с заглавной буквы I и наследуется знаком двоеточия (:).

Общая форма реализации интерфейса в C #:

имя класса class_name: имя_интерфейса {// class-body}

Определение абстрактного класса

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

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

абстрактный класс class_name {abstract method_name1 (); абстрактный method_name2 (); : return_type method_name3 (parameter_list) {// конкретный метод} return_type method_name4 (parameter_list) {// конкретный метод}};

Концепция абстрактного класса похожа как на Java, так и на C #. Абстрактный класс немного отличается в C ++.

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

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

Заключение:

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