Abstraktní třída vs. Rozhraní v Javě: Vysvětlení s příklady

Pro abstrakci v Javě se používají abstraktní třídy a rozhraní. Abstrakce v objektově orientovaném programování se týká skrývání detailů implementace před koncovými uživateli.

V abstrakci můžete vědět, jaké jsou funkce, ale nemůžete vědět, jak byly implementovány.

Podívejme se na každý z nich a pokusme se pochopit, proč se používají.

Abstraktní třída

Třída, kterou nelze vytvořit jako objekt a která může nebo nemusí mít abstraktní metody, se v Javě nazývá abstraktní třída. Abstraktní metoda je metoda, která při deklaraci nemá implementační tělo.

Příklad abstraktní třídy GraphicObject – Oracle

Abstraktní třídu můžete vytvořit zadáním klíčového slova abstract před klíčovým slovem class.

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

Abstraktní třída může být rozšířena o další třídy. Jinými slovy, může být také podtříděný.

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

Abstraktní třídy se používají k implementaci společných metod mezi více třídami, které rozšiřují danou abstraktní třídu. Také schopnost definovat abstraktní metody uvnitř abstraktních tříd je činí neuvěřitelně užitečnými pro třídy, které mají podobné metody, ale s různými implementacemi. Vezměme si příklad.

  Zpracování mezd je snazší, než si myslíte, se zvlněním etechblog.cz

Představte si auto, které má některé funkce, jako je start, stop, zpátečka atd. Tyto funkce jsou běžné u všech typů automobilů.

Ale co funkce automatizace, jako je samořízení? Implementace těchto funkcí se může u různých typů automobilů lišit. Podívejme se, jak můžete vytvořit objektově orientovaný program, který s tím souvisí.

Nejprve vytvořte třídu Car, která bude rozšířena o více tříd různých typů automobilů.

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

Metody start(), stop() a reverse() jsou metody, které jsou běžné ve všech autech. Jejich implementace je tedy definována již uvnitř samotné třídy Car. Určitý typ vozu však může mít různé implementace režimu samořízení. A tak můžete selfDrive() definovat jako abstraktní metodu a implementovat ji různými způsoby v různých třídách různých typů automobilů.

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

Je důležité poznamenat, že pokud podtřída neimplementuje všechny abstraktní metody definované v abstraktní třídě, měla by být sama deklarována jako abstraktní třída.

  Začněte své online podnikání ZDARMA se Sylius (Open Source eCommerce Platform)

Rozhraní

Rozhraní je způsob, jak sdělit třídě, jaké metody musí implementovat. Pokud například vezmete v úvahu příklad automobilu, má některé základní funkce. Může se spustit, pohybovat a zastavit. Tyto funkce jsou běžné u všech vozů.

Pokud tedy implementujete rozhraní vozu ve třídě, musíte implementovat všechny metody, aby vůz fungoval správně a bezpečně.

Podobně jako u abstraktních tříd nemůžeme vytvářet instance nebo vytvářet objekty rozhraní. Lze ji považovat za plně abstraktní třídu, protože obsahuje pouze abstraktní metody, tj. metody bez implementačního těla.

Rozhraní můžete vytvořit pomocí klíčového slova interface.

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

Implementujte rozhraní pomocí klíčového slova implements při definování třídy.

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

Podobnost

Žádná instance jako objekt není jediná věc, kterou mají abstraktní třídy a rozhraní společnou.

Rozdíly

Abstraktní třídaInterfaceDědičnost a implementace Třída může zdědit pouze jednu abstraktní třídu. Třída může implementovat více rozhraní. Typy proměnných Může mít konečné, nekonečné, statické a nestatické proměnné. Může mít pouze statické a konečné proměnné. Typy metod Může obsahovat jak abstraktní, tak neabstraktní metody. Může obsahovat pouze abstraktní metody, ale statické metody jsou výjimkou. Modifikátory přístupu Abstraktní třída může mít modifikátor přístupu. Signatury metod definované v rozhraní jsou standardně veřejné. Rozhraní nemá modifikátor přístupu.Konstruktory a destruktoryMůže deklarovat konstruktory a destruktory.Nemůže deklarovat konstruktory ani destruktory.RychlostRychláPomaláRozdíly mezi abstraktní třídou a rozhraním

  Proč mě sluchátka s potlačením hluku bolí uši?

Kdy použít abstraktní třídu a rozhraní?

Použijte abstraktní třídy, když:

  • Chcete sdílet některé společné metody a pole mezi více třídami.
  • Deklarace nestatických a nefinálních polí za účelem úpravy stavu objektu, ke kterému jsou vázána.

Rozhraní můžete použít, když:

  • Chcete definovat chování třídy, která implementuje rozhraní, ale nezajímá vás způsob, jakým je implementováno.
  • Chcete se ujistit, že třída implementuje všechny metody, aby správně fungovala.

Závěrečná slova

Rozhraní se používají hlavně k vytváření rozhraní API, protože mohou poskytnout strukturu pro implementaci funkcí bez obav o skutečnou implementaci.

Abstraktní třídy se obecně používají ke sdílení společných abstraktních a neabstraktních metod mezi více třídami, které rozšiřují abstraktní třídu, aby byl kód více znovu použitelný.

Zjistěte více o Javě pomocí těchto online kurzů pro Javu. Připravujete se na pohovor na Javě? Zde je několik otázek k pohovoru o objektově orientovaném programování.