Dědičnost

Proč to potřebuji?

Dědičnost umožňuje sdílet společný kód mezi příbuznými třídami a vytvářet hierarchie typů. Je to jeden ze tří pilířů OOP a základ pro polymorfismus a znovupoužitelnost kódu.

Teorie

Dědičnost umožňuje vytvořit novou třídu (podtřídu) na základě existující (nadtřídy). Podtřída dědí atributy a metody a může je rozšiřovat nebo přepisovat.

Generalizace = od specifického k obecnému (Student → Osoba). Specializace = od obecného ke specifickému (Osoba → Student).

Abstraktní třída nemůže být instanciována a může obsahovat abstraktní metody (bez implementace). Podtřída MUSÍ tyto metody implementovat.

Příklady

// Abstraktní nadtřída (generalizace)
public abstract class Tvar {
    protected String barva;

    public Tvar(String barva) {
        this.barva = barva;
    }

    // Abstraktní metoda – MUSÍ být implementována v podtřídě
    public abstract double obsah();
    public abstract double obvod();

    // Konkrétní metoda – zděděna beze změny
    public String getBarva() {
        return barva;
    }
}

// Specializace – Kruh
public class Kruh extends Tvar {
    private double polomer;

    public Kruh(String barva, double polomer) {
        super(barva); // volání konstruktoru nadtřídy
        this.polomer = polomer;
    }

    @Override
    public double obsah() {
        return Math.PI * polomer * polomer;
    }

    @Override
    public double obvod() {
        return 2 * Math.PI * polomer;
    }
}

// Specializace – Obdelnik
public class Obdelnik extends Tvar {
    private double a, b;

    public Obdelnik(String barva, double a, double b) {
        super(barva);
        this.a = a;
        this.b = b;
    }

    @Override
    public double obsah() { return a * b; }

    @Override
    public double obvod() { return 2 * (a + b); }
}

// Použití
Tvar t1 = new Kruh("červená", 5);
Tvar t2 = new Obdelnik("modrá", 3, 4);
// Tvar t3 = new Tvar("zelená"); // CHYBA – abstraktní třídu nelze instanciovat

System.out.println(t1.obsah()); // 78.54
System.out.println(t2.obsah()); // 12.0

Shrnutí

Klíčové body

  • extends = dědičnost, super = volání nadtřídy
  • abstract třída nemůže být instanciována
  • Abstraktní metoda = pouze signatura, implementace v podtřídě
  • Java podporuje jen jednoduchou dědičnost tříd (jedna nadtřída)