Сравнительная таблица
Основа для сравнения | Интерфейс | Абстрактный класс |
---|---|---|
основной | Когда вам известно только о требованиях, а не о его реализации, вы используете «Интерфейс». | Когда вы частично знаете о реализациях, вы используете «Абстрактные классы». |
методы | Интерфейс содержит только абстрактные методы. | Абстрактный класс содержит абстрактные методы, а также конкретные методы. |
Модификатор доступа к методам | Методы интерфейса всегда "Public" и "Abstract", даже если мы не объявляем. Следовательно, это можно сказать как 100%, чистый абстрактный класс. | Не обязательно, чтобы метод в абстрактном классе был публичным и абстрактным. У него могут быть и конкретные методы. |
Ограниченный модификатор для методов | Метод интерфейса не может быть объявлен со следующими модификаторами: Государственный: частный и охраняемый Аннотация: финальная, статическая, синхронизированная, нативная, строгая. | Нет никаких ограничений на модификаторы абстрактной переменной класса. |
Модификатор доступа к переменным | Модификатор Acess, разрешенный для переменных интерфейса, является общедоступным, статическим и окончательным независимо от того, декларируем мы или нет. | Переменные в абстрактном классе не обязательно должны быть public, static, final. |
Ограниченные модификаторы для переменных | Переменные интерфейса не могут быть объявлены как частные, защищенные, временные, изменчивые. | Нет ограничений на модификаторы переменных абстрактного класса. |
Инициализация переменных | Переменные интерфейса должны быть инициализированы во время их объявления. | Не обязательно, чтобы переменные абстрактного класса были инициализированы во время его объявления. |
Экземпляр и статические блоки | Внутри интерфейса вы не можете объявить экземпляр или статический блок. | Абстрактный класс допускает экземпляр или статический блок внутри него. |
Конструкторы | Вы не можете объявить конструктор внутри интерфейса. | Вы можете объявить конструктор внутри абстрактного класса. |
Определение интерфейса
Java не допускает множественное наследование. То есть один класс не может наследовать более одного класса одновременно. Причину этого можно объяснить на примере. Предположим, у нас есть два родительских класса, A и B, и производный класс C. Производный класс C наследует классы A и B. Теперь у обоих классов A и B есть метод set (), тогда это будет вопрос. для класса C - то, какой метод set () класса должен наследовать. Решением этой проблемы является «интерфейс».
access_specifier interface interface_name {возвращаемый тип method-name1 (список параметров); возвращаемый метод 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 ++, если у класса хотя бы одна виртуальная функция, класс становится абстрактным классом. Вместо ключевого слова «абстрактный» ключевое слово «виртуальный» используется для объявления абстрактного метода.
Ключевые различия между интерфейсом и абстрактным классом в Java & C #
- Если у вас есть знания о том, «что требуется», но не о том, «как это будет реализовано», тогда следует использовать интерфейс. С другой стороны, если вы знаете, что требуется, и частично знаете, как это будет реализовано, используйте абстрактный класс.
- Интерфейс имеет все свои абстрактные методы, но абстрактный класс имеет некоторые абстрактные методы и некоторые конкретные методы.
- Методы внутри интерфейса являются открытыми и абстрактными, следовательно, он также называется чистым абстрактным классом. С другой стороны, методы внутри реферата не ограничиваются только публичностью и рефератом.
- Интерфейсный метод никогда не может быть закрытым, защищенным, окончательным, статическим, синхронизированным, нативным или строгим. С другой стороны, нет никаких ограничений на методы абстрактного класса.
- Переменные в интерфейсе являются общедоступными и конечными независимо от того, объявляем мы их или нет, тогда как нет никаких ограничений на то, чтобы переменные абстрактного класса были только общедоступными и конечными.
- Переменные в интерфейсе никогда не могут быть частными защищенными временными или изменчивыми, тогда как в абстрактном классе нет ограничений на переменные.
- Переменная интерфейса должна быть инициализирована во время объявления. С другой стороны, переменные в абстрактном классе могут быть инициализированы в любое время.
- Внутри интерфейса не может быть объявлен экземпляр или статический блок, но вы можете объявить экземпляр или статический блок внутри абстрактного класса.
- Вы не можете определить конструктор внутри интерфейса, тогда как вы можете определить конструктор внутри абстрактного класса.
Заключение:
Когда вам нужно создать базовый класс, который содержит обобщенную форму методов, которые могут быть реализованы производными классами в соответствии с их потребностями, в этом помогает концепция интерфейса и абстрактный класс.