Абстрактен клас 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");
    }
}

Абстрактните класове се използват за прилагане на общи методи сред множество класове, които разширяват даден абстрактен клас. Освен това способността да се дефинират абстрактни методи в абстрактни класове ги прави невероятно полезни за класове, които имат подобни методи, но с различни реализации. Да вземем пример.

  Добавете аудио към вашите Gif файлове

Помислете за автомобил, който има някои функции, като стартиране, спиране, заден ход и т.н. Тези функции са общи за всички видове автомобили.

Но какво ще кажете за функциите за автоматизация, като например самостоятелно шофиране? Изпълнението на тези функции може да се различава за различните видове автомобили. Нека да видим как можете да създадете обектно-ориентирана програма, свързана с него.

Първо, създайте клас автомобили, който ще бъде разширен с множество класове от различни типове автомобили.

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");
    }
}

Важно е да се отбележи, че ако даден подклас не прилага всички абстрактни методи, дефинирани в абстрактния клас, тогава той трябва да бъде деклариран като абстрактен клас.

  12 приложения за проследяване на книги, за да сте в крак с целите си за четене

Интерфейс

Интерфейсът е начин да се каже на клас какви методи трябва да бъдат имплементирани от него. Например, ако разгледате примера с кола, тя има някои основни функции. Може да стартира, да се движи и да спира. Тези функции са общи за всички автомобили.

Така че, ако внедрите интерфейс на автомобил в клас, трябва да внедрите всички методи, за да може автомобилът да функционира правилно и безопасно.

Подобно на абстрактните класове, ние не можем да инстанцираме или създаваме обекти на интерфейс. Може да се счита за напълно абстрактен клас, тъй като съдържа само абстрактни методи, т.е. методи без тяло на изпълнение.

Можете да създадете интерфейс, като използвате ключовата дума интерфейс.

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");
    }
}

сходство

Липсата на инстанция като обект е единственото общо нещо, което абстрактните класове и интерфейси имат.

Разлики

Abstract ClassInterfaceInheritance & ImplementationСамо един абстрактен клас може да бъде наследен от клас. Множество интерфейси могат да бъдат реализирани от клас. Типове променливи Може да има окончателни, неокончателни, статични и нестатични променливи. Може да има само статични и крайни променливи. Типове методи Може да съдържа както абстрактни, така и неабстрактни методи. Може да съдържа само абстрактни методи, но статичните методи са изключение. Модификатори на достъп Абстрактен клас може да има модификатор на достъп. Сигнатурите на метода, дефинирани в интерфейса, са публични по подразбиране. Интерфейсът няма модификатор за достъп. Конструктори и деструктори Може да декларира конструктори и деструктори. Не може да декларира конструктори или деструктори. Скорост Бързо Бавно Разлики между абстрактен клас и интерфейс

  Разработвайте приложения без кодиране с балон

Кога да използваме абстрактен клас и интерфейс?

Използвайте абстрактни класове, когато:

  • Искате да споделите някои общи методи и полета между множество класове.
  • Деклариране на нестатични и нефинални полета, за да се промени състоянието на обекта, към който са обвързани.

Можете да използвате интерфейси, когато:

  • Искате да дефинирате поведението на клас, който имплементира интерфейса, но не ви интересува начинът, по който е имплементиран.
  • Искате да сте сигурни, че даден клас прилага всички методи, за да функционира правилно.

Заключителни думи

Интерфейсите се използват главно за създаване на API, тъй като те могат да предоставят структура за внедряване на функционалност, без да се притеснявате за действителното внедряване.

Абстрактните класове обикновено се използват за споделяне на общи абстрактни и неабстрактни методи между множество класове, които разширяват абстрактния клас, за да направят кода по-повторно използваем.

Научете повече за Java с помощта на тези онлайн курсове за java. Подготвяте ли се за интервю за Java? Ето някои въпроси за интервю за обектно ориентирано програмиране.