Абстрактний клас Vs. Інтерфейс у Java: Пояснення з прикладами

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

В абстракції ви можете знати, які функціональні можливості, але ви не можете знати, як вони були реалізовані.

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

Абстрактний клас

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

Приклад абстрактного класу GraphicObject – Oracle

Ви можете створити абстрактний клас, вказавши ключове слово abstract перед ключовим словом class.

abstract class abstractClass {
    void run() {
        System.out.println("ran");
    }
}

Абстрактний клас може бути розширений іншими класами. Іншими словами, він також може бути підкласом.

abstract class AbstractClass {
    void run() {
        System.out.println("ran");
    }
}

class ExtendingAbstractClass extends AbstractClass {
    void newMethod() {
        System.out.println("new");
    }

    @Override
    void run() {
        System.out.println("override");
    }
}

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

  Як перевести баланс подарункової картки Amazon на інший обліковий запис

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

Але як щодо функцій автоматизації, таких як автономне керування? Реалізація цих функцій може відрізнятися для різних типів автомобілів. Давайте подивимося, як ви можете створити пов’язану з ним об’єктно-орієнтовану програму.

Перш за все, створіть клас автомобіля, який буде розширено кількома класами різних типів автомобілів.

abstract class Car {
    void start() {
        // implementation
        System.out.println("runs car");
    }

    void stop() {
        // implementation
        System.out.println("engine stops");
    }

    void reverse() {
        // implementation
        System.out.println("reverse mode enabled");
    }

    abstract void selfDrive();
}

Методи start(), stop() і reverse() є загальними для всіх автомобілів. Тому їх реалізація вже визначена в самому класі Car. Однак певний тип автомобіля може мати різні реалізації режиму самостійного водіння. Таким чином, ви можете визначити selfDrive() як абстрактний метод і реалізувати його різними способами в різних класах різних типів автомобілів.

class CarTypeA extends Car {
    @Override
    void start() {
        super.start();
    }

    @Override
    void stop() {
        super.stop();
    }

    @Override
    void reverse() {
        super.reverse();
    }

    void selfDrive() {
        // custom implementation
        System.out.println("Type A self driving mode enabled");
    }
}
class CarTypeB extends Car {
    // ...all similar methods

    void selfDrive() {
        // custom implementation
        // different implementation than CarTypeB
        System.out.println("Type B self driving mode enabled");
    }
}

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

  Що таке мережевий брандмауер і як він допомагає зупиняти атаки?

Інтерфейс

Інтерфейс – це спосіб повідомити класу, які методи повинні бути реалізовані ним. Наприклад, якщо ви розглянете приклад автомобіля, він має деякі основні функції. Він може запускатися, рухатися і зупинятися. Ці функції загальні для всіх автомобілів.

Отже, якщо ви реалізуєте інтерфейс автомобіля в класі, ви повинні реалізувати всі методи, щоб автомобіль функціонував належним чином і безпечно.

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

Ви можете створити інтерфейс за допомогою ключового слова interface.

interface CAR {
    void start();
    void stop();
    void move();
}

Реалізуйте інтерфейс, використовуючи ключове слово implements під час визначення класу.

class CarTypeB implements CAR {
    public void start() {
        System.out.println("started");
    }

    public void stop() {
        System.out.println("stopped");
    }

    public void move() {
        System.out.println("running");
    }
}

Подібність

Відсутність екземпляра як об’єкта – це єдине, що об’єднує абстрактні класи та інтерфейси.

відмінності

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

  13 найкращих багатокористувацьких ігор для PS4, у які варто пограти [2023 Edition]

Коли використовувати абстрактний клас та інтерфейс?

Використовуйте абстрактні класи, коли:

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

Ви можете використовувати інтерфейси, коли:

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

Заключні слова

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

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

Дізнайтеся більше про Java за допомогою цих онлайн-курсів для java. Ви готуєтеся до співбесіди на Java? Ось декілька питань для співбесіди з об’єктно-орієнтованого програмування.