Java: Abstraktní třídy, dědičnost a rozhraní
Z MiS
(Rozdíly mezi verzemi)
(Přidána kapitola ke klíčovému slovu super. Přehozeno rozhraní a abstraktní třída.) |
(Přidáno přetypování a příklad.) |
||
| Řádka 38: | Řádka 38: | ||
* Pokud potřebujeme v potomkovi přesto použít metodu předka, použijeme k tomu klíčové slovo <code>super</code>. | * Pokud potřebujeme v potomkovi přesto použít metodu předka, použijeme k tomu klíčové slovo <code>super</code>. | ||
* Klíčovým slovem <code>super</code> lze také zavolat konstruktor předka. | * Klíčovým slovem <code>super</code> lze také zavolat konstruktor předka. | ||
| + | |||
| + | |||
| + | == Přetypování == | ||
| + | * Potomek může vždy zastoupit předka. Do proměnné datového typu předka tedy můžeme uložit instanci třídy potomka. | ||
| + | * Jsou ale situace, kdy potřebujeme k takto uloženému potomkovi znovu přistupovat jako k potomkovi včetně všech jeho metod a atributů. | ||
| + | * V tom případě musíme použít přetypování. | ||
| + | |||
| + | * Přetypování zapíšeme tak, že do závorky před výraz, který vrací takto uloženého potomka, zapíšeme název třídy předka: | ||
| + | |||
| + | Prekazka prekazka = '''(Prekazka)''' this.getOneIntersectingObject(Prekazka.class); | ||
| + | if (prekazka != null) { | ||
| + | int prekazka.getPruhlednost(); | ||
| + | ... | ||
| + | } | ||
| + | |||
| + | <div class="Varovani">Pozor, musíme si být stoprocentně jisti, že objekt, který je uložen v proměnné datového typu <code>Predek</code> je ve skutečnosti opravdu datového typu <code>Potomek</code>. Pokud by nebyl, běh programu by skončil výjimečný stavem a aplikace by havarovala.</div> | ||
== Související stránky == | == Související stránky == | ||
* [[Objektově orientované programování]] | * [[Objektově orientované programování]] | ||
Verze z 28. 2. 2017, 10:15
Obsah |
Dědičnost
- Klíčové slovo
extends. - Třída může mít pouze jednu rodičovskou třídu!
- Potomek „dědí“ všechny vlastnosti předka.
- Potomek může kdykoli nahradit předka. Takže pokud máme proměnnou datového typu
Predek, můžeme do ní uložit instanci třídyPotomek. Opačně to však nejde!
- Příklad
public class Kamion {
int nosnost;
...
public int getNosnost() { return this.nosnost; }
...
}
public class KamionSPrivesem extends Kamion {
Prives prives;
...
public int getNosnost() {
return this.getHodnota()+this.prives.getHodnota();
}
...
}
Rozhraní
- Klíčové slovo
implements. - Může mít pouze hlavičky metod a veřejné konstantní atributy.
Abstraktní třída
- Klíčové slovo
abstract. - Těla některých metod nejsou uvedena.
Odkaz na předka — super
- Jsou situace, kdy potřebujeme změnit chování některé metody předka v potomkovi. Mluvíme o překrývání metod.
- Pokud potřebujeme v potomkovi přesto použít metodu předka, použijeme k tomu klíčové slovo
super. - Klíčovým slovem
superlze také zavolat konstruktor předka.
Přetypování
- Potomek může vždy zastoupit předka. Do proměnné datového typu předka tedy můžeme uložit instanci třídy potomka.
- Jsou ale situace, kdy potřebujeme k takto uloženému potomkovi znovu přistupovat jako k potomkovi včetně všech jeho metod a atributů.
- V tom případě musíme použít přetypování.
- Přetypování zapíšeme tak, že do závorky před výraz, který vrací takto uloženého potomka, zapíšeme název třídy předka:
Prekazka prekazka = (Prekazka) this.getOneIntersectingObject(Prekazka.class);
if (prekazka != null) {
int prekazka.getPruhlednost();
...
}
Pozor, musíme si být stoprocentně jisti, že objekt, který je uložen v proměnné datového typu
Predek je ve skutečnosti opravdu datového typu Potomek. Pokud by nebyl, běh programu by skončil výjimečný stavem a aplikace by havarovala.