NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!

Diskuze – Lekce 9 - Aréna s mágem (dědičnost a polymorfismus)

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Radka Jánská:23.4.2018 22:15

Ahoj, mam dotaz. Je tu psano, ze potomek vzdy musi volat konstruktor predka. Co kdyz ma predek pretizeny konstruktor? Co pak ma volat? Muzu si proste vybrat ten konstruktor, co se mi hodi? Diky.

 
Odpovědět
23.4.2018 22:15
Avatar
Radka Jánská:23.4.2018 22:18

A jeste jeden dotaz ... neporusujeme pouzitim modifikatoru protected u atributu zapouzdreni? V kapitole o getterech a setterech se az na vyjimky doporucuje pouzivat u atributu modifikator private. Je tohle ta vyjimka? Jak ochranim atributy pred zmenou zvenci? Zase diky.

 
Odpovědět
23.4.2018 22:18
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Radka Jánská
David Hartinger:23.4.2018 22:32

Protected to právě nevystavuje zvenčí, ale jen pro potomky, to je pořád zevnitř.

Odpovědět
23.4.2018 22:32
New kid back on the block with a R.I.P
Avatar
Radka Jánská:24.4.2018 18:56

V predchozi kapitole pises, ze protected zpristupnuje atributy vsem tridam v balicku a potomkum v jinych balickach ... takze pokud mam metodu main, tak musi byt v jinem balicku? Kolik miva takovy prumerny program balicku?

 
Odpovědět
24.4.2018 18:56
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Radka Jánská
David Hartinger:24.4.2018 19:07

Máš pravdu, moje chyba, Java má tohle dost nešikovně nastavené. Pokud bys chtěla atributy nebo metody zpřístupnit pouze potomkům, nepíše se před ně žádný modifikátor přístupu. Je to potom něco mezi private a protected. Doplním to tam.

Odpovědět
24.4.2018 19:07
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Radka Jánská:24.4.2018 22:13

Dekuju za vysvetleni. Je toho hodne, zvlast na zacatecnika jako ja, je jasne, ze zadne materialy nemuzou obsahovat vsechny informace... Moc ocenuju tvou rychlou odpoved.

 
Odpovědět
24.4.2018 22:13
Avatar
patrik.hrnciar:5.5.2018 13:34

Ahoj, v metode grafickyUkazatel v casti :
if ((pocet == 0) && (nazivu())) {
pocet = 1;
}
v pripade Maga bude v ukazovateli many vzdy minimalne 1 dielik aj ked bude mana = 0 , a mag bude nazive.

 
Odpovědět
5.5.2018 13:34
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:12.7.2018 9:58

O potomků je nutné vždy volat konstruktor předka. Je to z toho důvodu, že bez volání konstruktoru nemusí být instance správně inicializovaná. Konstruktor předka nevoláme pouze v případě, že žádný nemá. Náš konstruktor musí mít samozřejmě všechny parametry potřebné pro předka plus ty nové, co má navíc potomek. Některé potom předáme předkovi a některé si zpracujeme sami. Konstruktor předka se vykoná před naším konstruktorem.

To není úplně tak pravda.
Pokud voláš konstruktor předka, tak ten se inicializuje vždy "správně":)
Logika dědičnosti a proč se musí volat konstruktor předka spočívá v tom, že i když to tak nevypadá, tak my když voláme jakéhokoliv potomka, tak JVM v pozadí vytvoří i instance všech předků, ze kterých potom voláme překryté nebo zděděné metody tak, že my sice nevidíme, že to volá předek, ale je to tak.

V podstatě tato rekurze vytváření instancí na pozadí končí až u kořenové třídy všech tříd - Objektu.
Příklad: Vytvořím si třídu A a B. Třída B bude dědit z A. Jenže (a to si moc lidí hned tak neuvědomí) i třída A dědí. A dědí z Object class. (Object třída je jediná třída, která nedědí od nikoho).
Takže My můžeme vytvořit třeba i bezparametrický konstruktor u tříd A a B a následně vytvoříme novou instanci třídy B. JVM ovšem na pozadí vytvoří nejdřív novou instanci Object, potom novou instanci A a až potom instanci B.
A u parametrických tříd je to úplně to samé. Vždy volám aspoň jeden z konstruktorů předka - právě aby se vůbec mohlo z něčeho dědit.
U implicitních konstruktorů je jediná výjimka, protože ty jsou defaultně skryté, takže je není třeba definovat. Kdyby to tak nebylo, tak i když bychom si vytvořili úplně novou samostatnou třídu, tak bychom museli vždy psát:

public class newClass extends Object {
        public newClass() {
                super(); // <---- odkazuje (dědí) ze třídy Object a proto je třeba vytvořit bezparametrický konstruktor. Object jiný nemá
        }
}
Editováno 12.7.2018 9:59
Odpovědět
12.7.2018 9:58
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Jiří S.
Tvůrce
Avatar
Jiří S.:30.12.2018 12:17

Na mě je to moc složité. Ani jsem to nepřečetl celé. :-###

 
Odpovědět
30.12.2018 12:17
Avatar
Jozef Tomašec:18.2.2019 21:11

Popravde som sa v tej dedičnosti trocha stratil. Možno, keby bol priklad pisany rovno od zaciatku, ale pri tom prepisovani jednotlivych prikazov mi to prišlo komplikovanejšie.

 
Odpovědět
18.2.2019 21:11
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 91.