Відмінності між абстрактним класом та інтерфейсом на Java

Абстрактний клас проти інтерфейсу на Java

Щоб зрозуміти відмінності між абстрактним класом та інтерфейсом на Java, важливо, перш за все, зрозуміти кожен із них незалежно. Абстрактний клас на Java використовується в декларуванні підкласів із набором загальних характеристик. Загальне використання абстрактного класу - це супер клас інших класів, який, по суті, дозволяє йому поширити абстрактний клас. Абстрактне ключове слово використовується в декларації абстрактного класу. Як і у будь-якого іншого класу, абстрактний клас має поля, які описують методи та характеристики, які може виконувати клас. За допомогою простого оголошення абстрактного класу клас не може бути ініційований

Інтерфейс Java можна прирівняти до протоколу. Він являє собою задану та узгоджену поведінку, яка дозволяє полегшити взаємодію незв'язаних об'єктів. Залежно від користувача, інтерфейс є ключем до різних дій, що реалізуються. Отже, інтерфейс служить сполучною ланкою між виробником та споживачем. Таким чином, інтерфейси на Java - це група методів, що містять порожні тіла, які можуть мати постійні оголошення. Викриваючи клас інтерфейсу Java, це означає, що поведінка, що очікується від класу, - це реалізація всіх методів інтерфейсу.


Відмінності

По-перше, абстрактний клас допускає поля, які не є статичними або кінцевими, на відміну від статичних і кінцевих полів, що використовуються в інтерфейсах. В інтерфейсах не може бути використаного коду реалізації, і може бути код реалізації, який використовується в абстрактному класі. Коди реалізації, розгорнуті в абстрактному класі, можуть мати декілька або всі реалізовані методи. За замовчуванням усі методи інтерфейсу є "абстрактними".

Видимість також можлива для методів або членів абстрактного класу, який може відрізнятися, наприклад, загальнодоступним, захищеним, приватним або жодним. З іншого боку, видимість інтерфейсу може бути задана лише для одного режиму видимості, який є "загальнодоступним".

Абстрактний клас автоматично успадковує клас об’єктів. Це, по суті, означає, що такі методи, як clone () та equals (), включаються. В інтерфейсі неможливе успадкування класу об'єктів. Після цього абстрактний клас може мати конструктор, але інтерфейс не може мати його.

Інтерфейс на Java також має дуже важливу функцію з реалізацією декількох спадків, оскільки клас може мати лише один суперклас. Хоча може бути присутнім лише один суперклас, він може бути реалізований у будь-якій кількості інтерфейсів. В абстрактному класі неможливо мати декілька спадків.

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

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

Підсумок

  1. Абстрактні поля класу не є статичними або остаточними, на відміну від інтерфейсу, у якому є статичні та підсумкові таблиці.

  2. Жоден код реалізації не може використовуватися в інтерфейсах, тоді як він може бути використаний в абстрактному класі.

  3. Видимість інтерфейсу може бути публічною, тоді як видимість абстрактних класів може змінюватися.

  4. Абстрактний клас автоматично успадковує об’єктний клас, але це неможливо в інтерфейсі.

  5. Абстрактний клас швидший, ніж інтерфейс у реалізації.