Java a dědičnost, technické pozadí.

Jirka

Java a dědičnost, technické pozadí.
« kdy: 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.


aaaa

Re:Java a dědičnost, technické pozadí.
« Odpověď #1 kdy: 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

Re:Java a dědičnost, technické pozadí.
« Odpověď #2 kdy: 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.

Sten

Re:Java a dědičnost, technické pozadí.
« Odpověď #3 kdy: 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ů.

Jirka

Re:Java a dědičnost, technické pozadí.
« Odpověď #4 kdy: 22. 04. 2014, 20:44:59 »
Díky všem, už je mi to jasné.