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řídyabstracttří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)