Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Jirka 22. 04. 2014, 18:38:48

Název: Java a dědičnost, technické pozadí.
Přispěvatel: Jirka 22. 04. 2014, 18:38:48
Ahoj všichni, rád bych věděl, jak dědičnost v Javě technicky vlastně funguje. Je to jako v C++, kdy se v paměti vytvoří prvně nadtřída a poté podtřída, nebo dochází pouze ke vložení proměnných a metod z nadtřídy do podtřídy ?

Je-li to jako v C++, tak jak je pak možné vytvářet podtřídy bez zavolání rodičovského konstruktoru, podotýkám rodičovského konstruktoru, který jsem sám vytvořil, žádný implicitní.

Je-li to pouze vložení proměnných a metod z nadtřídy do podtřídy, tak jak je pak možné, mít v podtřídě proměnnou stejného názvu jako v nadtřídě, Java nedovoluje na rozdíl od C++ potlačování proměnných.

Samozřejmě umím dědičnost v Javě používat, ale rád vím, jak věci fungují. Děkuji za odpovědi.
Název: Re:Java a dědičnost, technické pozadí.
Přispěvatel: aaaa 22. 04. 2014, 19:10:34
Je-li to jako v C++, tak jak je pak možné vytvářet podtřídy bez zavolání rodičovského konstruktoru, podotýkám rodičovského konstruktoru, který jsem sám vytvořil, žádný implicitní.
http://www.artima.com/designtechniques/initializationP.html

Je-li to pouze vložení proměnných a metod z nadtřídy do podtřídy, tak jak je pak možné, mít v podtřídě proměnnou stejného názvu jako v nadtřídě, Java nedovoluje na rozdíl od C++ potlačování proměnných.
http://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.4.1
Název: Re:Java a dědičnost, technické pozadí.
Přispěvatel: Filip Jirsák 22. 04. 2014, 19:27:41
V Javě se v konstruktoru vždy nejprve volá konstruktor předka a pak se provede tělo konstruktoru. Pokud voláte konstruktor předka explicitně, musí to být vždy první řádek konstruktoru. Pokud nezavoláte konstruktor předka explicitně, zavolá se automaticky implicitní konstruktor předka.

Pokud máte v předkovi field s viditelností private, potomek o něm vůbec nic neví a můžete si v něm úplně nezávisle na předkovi nadefinovat field stejného jména. Pokud je field v potomkovi viditelný, a vy si tam nadeklarujete field stejného jména, field z předka jím překryjete.
Název: Re:Java a dědičnost, technické pozadí.
Přispěvatel: Sten 22. 04. 2014, 19:43:50
Ahoj všichni, rád bych věděl, jak dědičnost v Javě technicky vlastně funguje. Je to jako v C++, kdy se v paměti vytvoří prvně nadtřída a poté podtřída, nebo dochází pouze ke vložení proměnných a metod z nadtřídy do podtřídy ?

Je to jako v C++. Jediný rozdíl je, že virtuální metody přetížené potomkem se volají i z konstruktoru předka (v C++ se ty metody volají, jako by nebyly přetížené).

Je-li to jako v C++, tak jak je pak možné vytvářet podtřídy bez zavolání rodičovského konstruktoru, podotýkám rodičovského konstruktoru, který jsem sám vytvořil, žádný implicitní.

Je to stejné jako v C++. Pokud deklarujete vlastní konstruktor, žádný implicitní se nevytvoří (Java nemá kopírovací konstruktory). Pokud má třída víc konstruktorů, konstruktor v jejím potomkovi může volat libovolný. Pokud nevoláte žádný konstruktor explicitně, je implicitně zavolán konstruktor bez parametrů.
Název: Re:Java a dědičnost, technické pozadí.
Přispěvatel: Jirka 22. 04. 2014, 20:44:59
Díky všem, už je mi to jasné.