Sobes.tech
Middle

Kdy byste měli použít rozhraní a kdy abstrétní třídu?

sobes.tech AI

Odpověď od AI

Používáme abstraktní třídu k vytvoření základní funkčnosti a obecného stavu, který mohou dědit podtřídy. Je vhodná, když existují společné metody s implementací a metody, které je třeba přepsat. Abstraktní třída může mít pole a konstruktory.

// Abstraktní třída
abstract class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    abstract void makeSound(); // Abstraktní metoda

    void eat() { // Metoda s implementací
        System.out.println(name + " jí.");
    }
}

Používáme rozhraní k definování smlouvy, která popisuje sadu metod, jež musí být implementovány třídami. Je vhodné pro dosažení vícenásobného chování (vícenásobného dědičnosti funkcionality). Rozhraní nemůže mít stav (instance pole, kromě konstant) ani konstruktory (před Java 8).

// Rozhraní
interface Flyable {
    void fly(); // Abstraktní metoda
}

Tabulka srovnání rozdílů:

Vlastnost Abstraktní třída Rozhraní
Typ členů Pole, abstraktní a konkrétní metody, konstruktory Konstanty, abstraktní metody (výchozí), statické a default metody (od Java 8)
Implementace metod Může mít metody s implementací Pouze abstraktní metody do Java 8, od Java 8 - static a default
Stav Může mít stav (pole) Nemůže mít stav (instance pole)
Dědičnost Jednoduchá dědičnost Vícenásobná implementace
Použití "je-a" (is-a) - základní typ "má-a" (has-a) - smlouva o chování