logo

Різниця між абстрактним класом та інтерфейсом у Java

Абстрактний клас та інтерфейс використовуються для визначення контрактів в об’єктно-орієнтованому програмуванні, але між ними є деякі ключові відмінності.

Різниця між абстрактним класом та інтерфейсом: -

Визначення: абстрактний клас — це клас, який не може бути створений і може містити як абстрактні, так і неабстрактні методи. З іншого боку, інтерфейс — це контракт, який визначає набір методів, які має реалізувати клас.



Реалізація методу: в абстрактному класі деякі методи можуть бути реалізовані, тоді як інші залишаються абстрактними, тобто вони не мають реалізації та повинні бути перевизначені конкретними підкласами. Навпаки, всі методи в інтерфейсі за замовчуванням є абстрактними і повинні бути реалізовані будь-яким класом, який реалізує інтерфейс.

Успадкування: клас може успадковувати лише один абстрактний клас, але він може реалізувати кілька інтерфейсів. Це пояснюється тим, що абстрактний клас представляє тип об’єкта, тоді як інтерфейс представляє набір поведінки.

Модифікатори доступу: абстрактні класи можуть мати такі модифікатори доступу, як public, protected і private для своїх методів і властивостей, тоді як інтерфейси можуть мати лише публічний доступ.

Змінні: абстрактний клас може мати змінні-члени, а інтерфейс — ні.

Таким чином, абстрактні класи використовуються для забезпечення базового класу для успадкування конкретних підкласів, тоді як інтерфейси використовуються для визначення набору методів, які має реалізувати клас. Абстрактні класи можуть мати реалізовані та абстрактні методи, тоді як інтерфейси можуть мати лише абстрактні методи. Класи можуть успадковувати лише один абстрактний клас, але можуть реалізовувати декілька інтерфейсів.

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

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

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

  • Тип методів: Інтерфейс може мати лише абстрактні методи. Тоді як абстрактний клас може мати абстрактний метод і конкретні методи. Починаючи з Java 8, він також може мати методи за замовчуванням і статичні. Починаючи з Java 9, він також може мати приватні конкретні методи.
  • Примітка: Конкретні методи – це методи, які мають повне визначення, але їх також можна замінити в успадкованому класі. Однак, якщо ми зробимо конкретний метод як ФІНАЛ його не можна перевизначити в успадкованому класі, оскільки оголошення методу як final означає – його реалізація завершена .
  • Кінцеві змінні: Змінні, оголошені в інтерфейсі Java, за замовчуванням є остаточними. Абстрактний клас може містити нефінальні змінні.
  • Тип змінних: Абстрактний клас може мати фінальні, нефінальні, статичні та нестатичні змінні. Інтерфейс має лише статичні та кінцеві змінні.
  • Реалізація: Абстрактний клас може забезпечити реалізацію інтерфейсу. Інтерфейс не може забезпечити реалізацію абстрактного класу.
  • Спадкування проти абстракції: Інтерфейс Java можна реалізувати за допомогою ключового слова інвентар і абстрактний клас можна розширити за допомогою ключового слова поширюється .
  • Кілька реалізацій: Інтерфейс може розширювати один або декілька інтерфейсів Java; абстрактний клас може розширити інший клас Java і реалізувати кілька інтерфейсів Java.
  • Множинне успадкування: Множинного успадкування можна частково досягти за допомогою інтерфейсів, тоді як те ж саме не можна зробити за допомогою абстрактних класів. Тому що в Java один клас може реалізувати кілька інтерфейсів, але один клас не може поширюватися з багатьох інших класів, оскільки це просто неможливо в java, оскільки це призведе до проблеми з діамантом.
  • Доступність елементів даних: Члени (змінні) інтерфейсу Java є остаточними за замовчуванням. Абстрактний клас Java може мати такі члени класу, як private, protected тощо.

Особливості абстрактного класу: -

баш еліф

Абстрактний клас — це особливий тип класу в об’єктно-орієнтованому програмуванні, екземпляр якого неможливо створити безпосередньо. Замість цього він служить схемою або шаблоном для інших класів, які будуть похідними. Абстрактний клас:

  1. Неможливо створити екземпляр : абстрактні класи не можуть бути створені безпосередньо, що означає, що ви не можете створювати об’єкти абстрактного класу.
  2. Містить принаймні одну суто віртуальну функцію : абстрактні класи повинні містити принаймні одну чисту віртуальну функцію, що означає, що функція не має реалізації та повинна бути реалізована будь-якими похідними класами.
  3. Може містити як абстрактні, так і неабстрактні методи : абстрактні класи можуть мати як абстрактні, так і неабстрактні методи. Неабстрактні методи мають повну реалізацію і можуть бути викликані безпосередньо.
  4. Може мати конструктори та деструктори : абстрактні класи можуть мати конструктори та деструктори, як і будь-який інший клас.
  5. Може мати змінні-члени : абстрактні класи можуть мати змінні-члени, які є змінними, що належать об’єкту класу.
  6. Може використовуватися як базовий клас : Абстрактні класи можна використовувати як базовий клас для інших класів, що означає, що вони можуть бути успадковані іншими класами.

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

Приклад 1: (для абстрактного класу)

Java
abstract class sunstar {    abstract void printInfo(); } class employee extends sunstar {  void printInfo()  {  String name = 'avinash';  int age = 21;  float salary = 222.2F;  System.out.println(name);  System.out.println(age);  System.out.println(salary);  } } class base {  public static void main(String args[])  {  sunstar s = new employee();  s.printInfo();  } }>

Вихід
avinash 21 222.2>

Приклад 2: (для абстрактного класу)

Java
// Java Program to Illustrate Concept of // Abstract Class // Importing required classes import java.io.*; // Class 1 // Helper abstract class abstract class Shape {  // Declare fields  String objectName = ' ';  // Constructor of this class  Shape(String name) { this.objectName = name; }  // Method  // Non-abstract methods  // Having as default implementation  public void moveTo(int x, int y)  {  System.out.println(this.objectName + ' '  + 'has been moved to'  + ' x = ' + x + ' and y = ' + y);  }  // Method 2  // Abstract methods which will be  // implemented by its subclass(es)  abstract public double area();  abstract public void draw(); } // Class 2 // Helper class extending Class 1 class Rectangle extends Shape {  // Attributes of rectangle  int length, width;  // Constructor  Rectangle(int length, int width, String name)  {  // Super keyword refers to current instance itself  super(name);  // this keyword refers to current instance itself  this.length = length;  this.width = width;  }  // Method 1  // To draw rectangle  @Override public void draw()  {  System.out.println('Rectangle has been drawn ');  }  // Method 2  // To compute rectangle area  @Override public double area()  {  // Length * Breadth  return (double)(length * width);  } } // Class 3 // Helper class extending Class 1 class Circle extends Shape {  // Attributes of a Circle  double pi = 3.14;  int radius;  // Constructor  Circle(int radius, String name)  {  // Super keyword refers to parent class  super(name);  // This keyword refers to current instance itself  this.radius = radius;  }  // Method 1  // To draw circle  @Override public void draw()  {  // Print statement  System.out.println('Circle has been drawn ');  }  // Method 2  // To compute circle area  @Override public double area()  {  return (double)((pi * radius * radius));  } } // Class 4 // Main class class GFG {  // Main driver method  public static void main(String[] args)  {  // Creating the Object of Rectangle class  // and using shape class reference.  Shape rect = new Rectangle(2, 3, 'Rectangle');  System.out.println('Area of rectangle: '  + rect.area());  rect.moveTo(1, 2);  System.out.println(' ');  // Creating the Objects of circle class  Shape circle = new Circle(2, 'Circle');  System.out.println('Area of circle: '  + circle.area());  circle.moveTo(2, 4);  } }>

Вихід
Area of rectangle: 6.0 Rectangle has been moved to x = 1 and y = 2 Area of circle: 12.56 Circle has been moved to x = 2 and y = 4>

Що робити, якщо у нас немає спільного коду між прямокутником і колом, тоді скористайтеся інтерфейсом.

Інтерфейс:

Особливості інтерфейсу:

Інтерфейс:

  1. Визначає набір методів і властивостей: Інтерфейс визначає набір методів і властивостей, які повинні бути реалізовані будь-яким класом або структурою, що реалізує інтерфейс.
  2. Надає загальний протокол: Інтерфейси забезпечують загальний протокол, який дозволяє різним програмним компонентам спілкуватися один з одним.
  3. Підтримує поліморфізм: Інтерфейс можна використовувати для досягнення поліморфізму, що означає, що об’єкти різних класів можна розглядати так, ніби вони належать до одного типу, якщо вони реалізують той самий інтерфейс.
  4. Дозволяє розділити проблеми: Інтерфейси дозволяють розділяти проблеми, що означає, що різні частини програмної системи можна розробляти незалежно одна від одної, якщо вони відповідають специфікаціям інтерфейсу.
  5. Покращує повторне використання коду: Інтерфейси покращують повторне використання коду, дозволяючи різним компонентам програмного забезпечення повторно використовувати ту саму кодову базу, якщо вони реалізують той самий інтерфейс.
  6. Застосовує шаблони проектування: Інтерфейси можна використовувати для забезпечення виконання шаблонів проектування, таких як шаблон адаптера, вимагаючи, щоб певні методи або властивості були реалізовані класами реалізації.
  7. Полегшує тестування: Інтерфейси полегшують тестування, дозволяючи тестувати програмні компоненти незалежно один від одного, використовуючи макетні об’єкти, які реалізують інтерфейс.

Приклад 1: для інтерфейсу

Java
// Java Program to Illustrate Concept of Interface // Importing I/O classes import java.io.*; // Interface interface Shape {  // Abstract method  void draw();  double area(); } // Class 1 // Helper class class Rectangle implements Shape {  int length, width;  // constructor  Rectangle(int length, int width)  {  this.length = length;  this.width = width;  }  @Override public void draw()  {  System.out.println('Rectangle has been drawn ');  }  @Override public double area()  {  return (double)(length * width);  } } // Class 2 // Helper class class Circle implements Shape {  double pi = 3.14;  int radius;  // constructor  Circle(int radius) { this.radius = radius; }  @Override public void draw()  {  System.out.println('Circle has been drawn ');  }  @Override public double area()  {  return (double)((pi * radius * radius));  } } // Class 3 // Main class class GFG {  // Main driver method  public static void main(String[] args)  {  // Creating the Object of Rectangle class  // and using shape interface reference.  Shape rect = new Rectangle(2, 3);  System.out.println('Area of rectangle: '  + rect.area());  // Creating the Objects of circle class  Shape circle = new Circle(2);  System.out.println('Area of circle: '  + circle.area());  } }>

Вихід
Area of rectangle: 6.0 Area of circle: 12.56>

Приклад 2: для інтерфейсу

Java
// Java Program to Illustrate Concept of Interface // Importing I/O classes import java.io.*; // Interface interface Shape {  // Abstract method  void draw();  double area(); } // Class 1 // Helper class class Rectangle implements Shape {  int length, width;  // constructor  Rectangle(int length, int width)  {  this.length = length;  this.width = width;  }  @Override public void draw()  {  System.out.println('Rectangle has been drawn ');  }  @Override public double area()  {  return (double)(length * width);  } } // Class 2 // Helper class class Circle implements Shape {  double pi = 3.14;  int radius;  // constructor  Circle(int radius) { this.radius = radius; }  @Override public void draw()  {  System.out.println('Circle has been drawn ');  }  @Override public double area()  {  return (double)((pi * radius * radius));  } } // Class 3 // Main class class GFG {  // Main driver method  public static void main(String[] args)  {  // Creating the Object of Rectangle class  // and using shape interface reference.  Shape rect = new Rectangle(2, 3);  System.out.println('Area of rectangle: '  + rect.area());  // Creating the Objects of circle class  Shape circle = new Circle(2);  System.out.println('Area of circle: '  + circle.area());  } }>

Вихід
Area of rectangle: 6.0 Area of circle: 12.56>

Коли що використовувати?

Розгляньте можливість використання абстрактних класів, якщо будь-яке з цих тверджень стосується вашої ситуації:

  • У додатку Java є кілька пов’язаних класів, які потребують спільного використання деяких рядків коду, тоді ви можете помістити ці рядки коду в абстрактний клас, і цей абстрактний клас має бути розширений усіма цими пов’язаними класами.
  • Ви можете визначити нестатичні або нефінальні поля в абстрактному класі, щоб за допомогою методу ви могли отримати доступ і змінити стан об’єкта, до якого вони належать.
  • Ви можете очікувати, що класи, які розширюють абстрактний клас, матимуть багато загальних методів або полів або вимагатимуть модифікаторів доступу, відмінних від публічних (наприклад, protected і private).

Розгляньте можливість використання інтерфейсів, якщо будь-яке з цих тверджень стосується вашої ситуації:

  • Це повна абстракція, всі методи, оголошені в інтерфейсі, повинні бути реалізовані класом(ами), який реалізує цей інтерфейс.
  • Клас може реалізовувати більше одного інтерфейсу. Це називається множинним успадкуванням.
  • Ви хочете вказати поведінку певного типу даних, але вас не цікавить, хто реалізує його поведінку.