Ключова різниця: інтерфейс або протокол - це звичайний спосіб, який дозволяє незв'язаним об'єктам спілкуватися один з одним. Вона являє собою узгоджену поведінку, що полегшує взаємодію між двома об'єктами. Абстрактний клас - це клас об'єктів, які не можуть бути створені примірниками об'єкта. Цей клас може не мати реалізації або може мати неповну реалізацію.
Java - це мова програмування, на яку вплинула мова С. Це значною мірою породжує його синтаксис з C і C ++, однак він має менше можливостей низького рівня, ніж теж. Java - це мова програмування загального призначення, яка розроблена так, щоб мати меншу залежність від реалізації порівняно з попередніми мовами. Це одночасно, на основі класу і об'єктно-орієнтованої мови.
Java була розроблена Джеймсом Госліном у Sun Microsystems і була випущена в 1995 році. Вона була спочатку випущена як основний компонент платформи Java Sun Microsystems. З тих пір компанія Sun змінила ліцензію на більшість своїх технологій Java за ліцензією GNU General Public License. Це означає, що всі технології, ліцензовані під GNU General Public License, є відкритим кодом і загалом доступні безкоштовно. Нарешті, Sun Microsystems об'єдналася з корпорацією Oracle. З 2012 року Java стала однією з найпопулярніших мов програмування для використання. Це особливо стосується веб-додатків клієнт-сервер. Багато інших систем розробили альтернативні реалізації технологій Sun, таких як GNU Compiler for Java і GNU Classpath.
Абстрактний клас - це клас об'єктів, які не можуть бути створені примірниками об'єкта. Цей клас може не мати реалізації або може мати неповну реалізацію. Він також може мати абстрактні методи або властивості, які поділяються всіма підкласами. У деяких мовах програмування абстрактні типи без реалізації називаються інтерфейсами. В Java абстрактний тип можна створити за допомогою ключового слова 'abstract' у визначенні класу. Мета - мати абстрактний клас для розміщення всіх методів, які не реалізовані в абстрактному класі, і залишити його підкласу, щоб визначити, як реалізувати ці класи. Якщо клас має єдиний абстрактний метод, клас повинен бути оголошений як абстрактний клас, хоча для оголошення абстракції класу не потрібно мати принаймні один метод.
Malliktalksjava.in перелічує основні відмінності між інтерфейсом і абстрактними як:
- Абстрактний клас має конструктор, але інтерфейс не має.
- Абстрактні класи можуть мати реалізації для деяких її членів (Methods), але інтерфейс не може мати реалізації для будь-якого з його членів.
- Абстрактні класи повинні мати підкласи, які будуть марними.
- Інтерфейси повинні мати реалізації іншими класами, які будуть марними
- Тільки інтерфейс може розширити інший інтерфейс, але будь-який клас може розширити абстрактний клас.
- Всі змінні в інтерфейсах є остаточними за замовчуванням
- Інтерфейси забезпечують форму множинного успадкування. Клас може поширюватися тільки на один інший клас.
- Інтерфейси обмежені публічними методами і константами без реалізації. Абстрактні класи можуть мати часткову реалізацію, захищені частини, статичні методи і т.д.
- Клас може реалізовувати кілька інтерфейсів. Але у випадку абстрактного класу клас може поширюватися лише на один абстрактний клас.
- Інтерфейси є повільними, тому що вимагає додаткової спрямованості, щоб знайти відповідний метод у фактичному класі. Анотація класів швидко.
- Модифікатор доступності (відкритий / приватний / внутрішній) дозволений для абстрактного класу. Інтерфейс не дозволяє модифікатор доступності
- Абстрактний клас може містити повні або неповні методи. Інтерфейси можуть містити тільки підпис методу, але не тіло. Таким чином, абстрактний клас може реалізувати методи, але інтерфейс не може реалізувати методи.
- Абстрактний клас може містити поля, конструктори або деструктори та властивості реалізації. Інтерфейс не може містити полів, конструкторів або деструкторів і має лише підпис властивості, але не має реалізації.
- Різні модифікатори доступу, такі як абстрактні, захищені, внутрішні, загальнодоступні, віртуальні і т.д. корисні в абстрактних класах, але не в інтерфейсах.
- Анотація сфери до похідного класу.
- Інтерфейс інтерфейсу до будь-якого рівня успадкування.
Інформація для таблиці надана codeproject.com та mindprod.com
Інтерфейс | Анотація класу | |
Багаторазове успадкування | Клас може успадковувати кілька інтерфейсів. | Клас може успадковувати лише один абстрактний клас. |
Реалізація за умовчанням | Інтерфейс не може забезпечити будь-який код, а лише підпис. | Анотація класу може забезпечити повний код за замовчуванням та / або лише деталі, які необхідно перевизначити. |
Модифікатори доступу | Інтерфейс не може мати модифікаторів доступу для підсистем, функцій, властивостей тощо. | Абстрактний клас може містити модифікатори доступу для subs, функцій, властивостей. |
Core і Peripheral | Інтерфейси використовуються для визначення периферійних можливостей класу. Іншими словами, і людський, і транспортний засіб можуть успадковуватися від інтерфейсу, який можна змінювати. | Абстрактний клас визначає основну ідентифікацію класу, і він використовується для об'єктів одного типу. |
Гомогенність | Якщо різні реалізації тільки поділяють підписи методу, то краще використовувати інтерфейси. | Якщо різні реалізації мають однаковий вид і використовують загальну поведінку або стан, то абстрактний клас краще використовувати. |
Швидкість | Потрібно більше часу для пошуку фактичного методу у відповідних класах. | Швидко |
Додавання функціональності | Якщо до інтерфейсу додати новий метод, то треба відстежити всі реалізації інтерфейсу і визначити реалізацію для нового методу. | Якщо додати абстрактний клас до нового методу, то ми маємо можливість надавати реалізацію за замовчуванням, і тому весь існуючий код може працювати належним чином. |
Поля і константи | У інтерфейсах не можуть бути визначені поля. | У абстрактному класі можуть бути визначені поля і константи. |
Строгість | Постійні декларації в інтерфейсі вважаються загальнодоступними статичними фінальними. | Спільний код може бути доданий до абстрактного класу. |
Константи | Тільки статичні кінцеві константи можуть використовувати їх без кваліфікації в класах, що реалізують інтерфейс. | Можливі як екземпляри, так і статичні константи. Можна також обчислити константи як статичний, так і екземплярний код. |
Зручність третіх осіб | Реалізація інтерфейсу може бути додана до будь-якого існуючого класу третьої сторони. | Клас третіх сторін повинен бути переписаний лише з абстрактного класу. |
це-a у порівнянні з працездатністю або можливістю | Інтерфейси часто використовуються для опису периферійних можливостей класу, а не його центральної ідентичності, наприклад, клас Автомобіля може реалізовувати інтерфейс Recyclable, який може застосовуватися до багатьох абсолютно не пов'язаних об'єктів. | Абстрактний клас визначає основну ідентичність його нащадків. Реалізовані інтерфейси перераховують загальні речі, які клас може робити, а не те, що клас є. У контексті Java користувачі повинні зазвичай реалізовувати інтерфейс Runnable, а не розширювати Thread, тому що вони насправді не зацікавлені в наданні деяких нових функцій Thread, вони звичайно просто хочуть, щоб деякі коди мали можливість самостійно працювати. Вони хочуть створити щось, що може бути запущене в нитку, а не новий вид потоку. Аналогічна дискусія виникає, коли ви вирішили наслідувати або делегувати. |
Підключати | Користувач може написати новий модуль заміни для інтерфейсу, який містить не одну пачку коду спільно з існуючими реалізаціями. Коли користувач реалізує інтерфейс, вони починаються з нуля без будь-якої реалізації за замовчуванням. Користувач повинен отримувати інструменти з інших класів; Ніщо не має інтерфейсу, окрім декількох констант. Це дає користувачеві свободу реалізувати кардинально інший внутрішній дизайн. | Користувач повинен використовувати абстрактний клас як є для кодової бази, з усіма супутнім багажем, хорошим або поганим. Автор абстрактного класу наклав структуру на користувача. |
Технічне обслуговування | Якщо клієнтський код розмовляє тільки з точки зору інтерфейсу, можна легко змінити конкретну реалізацію за ним, використовуючи заводський метод. | Якщо клієнтський код розмовляє тільки в термінах абстрактного класу, можна легко змінити конкретну реалізацію за ним, використовуючи заводський метод. |