Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



dědičnost v javě

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: dedicnost v jave

Autor: tronicek

13:17:54 10.11.2011

rudyment napsal(a):
> KdyŞ uŞ se v tom vyznáme, tak je to, jak tomu budeme řákat, opravdu
celkem
> jedno. Mám ale vyzkoušeno, Şe kdyŞ chci, aby to studenti opravdu vnitřně
pochopili, tak na tom názvu docela záleŞí, protoŞe si při různÊ
terminologii představují různÊ věci.
> Označíme-li alokaci pamětí opravdu jako alekaci paměti a její následnou
inicializaci jako konstrukci objektu, začnou pro studenty být mnohÊ
syntaktickÊ konstrukce a mnohÊ chování výrazně pochopitelnější.

Ja jen odpovidal na otazku "Jak je mozne volat metodu na objektu, ktery
dosud nebyl vytvoren?". V modelu, ktery popisujete, se hleda odpoved
tezko, proto jsem sestoupil o uroven nize, na uroven JVM.
Mozna to bude znit prekvapive, ale pomerne dost vlastnosti jazyka je
urceno implementaci. Vzpominam si, ze kdyz jsem se pred lety prihlasil do
konference o javovskych uzaverech (closures), tak jsem byl zdesen, ze tam
lide zduvodnovali semantiku navrhu implementaci. Jenze ono to v mnoha
pripadech ani jinak nejde. Je hezke se bavit o tom, jak by mely uzavery
vypadat, ale pak se stejne musi clovek vratit na zem a vybrat jen to, co
lze v JVM naimplementovat.

Z.T.
--
Zdenek Tronicek
FIT CTU in Prague


Příspěvek zaslán emailem

Citovat příspěvek

 

Re: dedicnost v jave

Autor: rudyment

23:27:27 09.11.2011

tronicek Napsal:
-------------------------------------------------------
> Ja popisoval, co se deje na urovni bajtkodu a to,
> zda budeme prvni krok nazyvat vytvoreni objektu
> nebo alokaci je pameti je vcelku jedno.

Když už se v tom vyznáme, tak je to, jak tomu budeme řákat, opravdu celkem jedno. Mám ale vyzkoušeno, že když chci, aby to studenti opravdu vnitřně pochopili, tak na tom názvu docela záleží, protože si při různé terminologii představují různé věci.

Označíme-li alokaci pamětí opravdu jako alekaci paměti a její následnou inicializaci jako konstrukci objektu, začnou pro studenty být mnohé syntaktické konstrukce a mnohé chování výrazně pochopitelnější.



> Ma to vsak blize k vytvoreni objektu
> a take specifikace JVM to tak nazyva.

Specifikaci JVM nevytvářejí pedagogové, ale programátoři, kteří si kolikrát neuvědomují, že používají termíny v jiném smyslu, než v jakém by je chápal běžný člověk.

Jak mohu za vytvoření objektu označit operaci, po jejímž dokončení vzápětí prohlásím, že objekt ještě vytvořen není. Vždyť to je protimluv. A takových je ve specifikaci víc. Pak se nemůžeme divit, že v tom mají studenti guláš.

Já to každoročně pozoruji na studentech, kteří k nám přicházejí z jiných fakult, protože si chtěji dodělat ekonomickou nadstavbu. V prvních hodinách jsou viděšení, protože se dozvídají, že OO program je něco docela jiného, než co je učili na jejich škole. Po pár týdnech se překlopí a začnou se naopak divit, proč je programování učili tak složitě abstraktně a nevysvětlili jim, že je to vlastně přirozený popis, který používali dávno před tím, než se začali učit programovat.

Citovat příspěvek

 

Re: dědičnost v javě

Autor: Mi.Chal

20:28:28 09.11.2011

jimB Napsal:
-------------------------------------------------------
> Bohužel nepřečtu co pan tronicek napsal. Pokaždé u
> jeho příspěvků vidím rozsypaný čaj

snad bys necekal, ze tenhle web bude v roce 2011 podporovat maily v UTF-8? :-)

Citovat příspěvek

 

Re: dedicnost v jave

Autor: tronicek

17:22:50 09.11.2011

Konstruktory se nededi, ale konstruktor potomka vzdy vola konstruktor
predka nebo jiny konstruktor stejne tridy, ktery vola konstruktor predka.

Z.T.
--
Zdenek Tronicek
FIT CTU in Prague


Petr Dopita napsal(a):
>
>
> Ještě otázečka,
> dochází i ke zdědění konstruktoru ze třídy BaseClass ?
>
> public class BaseClass {
> BaseClass() {
> System.out.println(this.toString());
> showText();
> }
> public void showText() {
> System.out.println("call from base class");
> }
> public void showText3() {
> System.out.println(this.toString());
> System.out.println("test");
> }
> }
>
> protoŞe kdyŞ přidám do konstruktoru předka řádek
> System.out.println(this.toString());, tak dostanu ExtendClass@45bab50a.
> ÄŚili objekt typu ExtendClass.
>
> děkuji
> --
> Autor: Petr Dopita
> Forum: Java
> Odkaz: http://forum.builder.cz/read.php?14,3336496,3336510#msg-3336510
>


Příspěvek zaslán emailem

Citovat příspěvek

 

Re: dedicnost v jave

Autor: tronicek

17:08:49 09.11.2011

Ja popisoval, co se deje na urovni bajtkodu a to, zda budeme prvni krok
nazyvat vytvoreni objektu nebo alokaci je pameti je vcelku jedno. Ma to
vsak blize k vytvoreni objektu a take specifikace JVM to tak nazyva.
Tady je vystup z dekompilatoru:

public static void main(java.lang.String[]);
Code:
0: new #29; //class examples/Objekty
3: dup
4: astore_2
5: invokespecial #27; //Method examples/Objekty."":()V
8: aload_2
9: invokevirtual #17; //Method examples/Objekty.verejna:()V
12: return
}

Radek 0 je alokace pameti + vynulovani, radek 5 je volani konstruktoru.
Instrukce invokespecial ocekava odkaz na "objekt" na operandovem zasobniku
a pouziva se napr. i pro privatni metody. Konstruktor je totiz v JVM
obycejna metoda s trochu zvlastnim jmenem .

Ta analogie s hlinou je hezka, plati vsak jen na urovni programovaciho
jazyka. V JVM je malinko jinak.
Nicmene je pravda, ze dokud nezavolame konstruktor, JVM "pamet" nepovazuje
za objekt. Tj. JVM nas nuti konstruktor zavolat.

Z.T.
--
Zdenek Tronicek
FIT CTU in Prague


rudyment napsal(a):
>
>
> Asi to budete označovat jako slovíčkaření, ale odmítám označovat první
> krok kontrukce objektu jako vytvoření objektu. V prvním kroku se neděje
> nic jinÊho, neŞ Şe virtuální stroj alokuje a inicializuje paměť. Objekt
> vytváří aŞ kontruktor. Dokud kontruktor neskončí svoji práci, nelze
> povaŞovat objekt za vytvořený.
>
> V učebnicích to přirovnávám k tvorbě hrníčků. TakÊ nebudeme říkat, Şe
> hrnek vyrobila příroda, z níŞ hrnčíř vzal hlínu. Virtuláním strojem
> alokovaná paměť slouŞí konstruktoru obdobně jako hlína hrnčíři. Teprve on
> (hrnčíř, kontruktor) určí výslednou podobu výrobku (objektu) a je
> zodpovědný za jeho chování.
>
> K demonstraci toho, jak probíhá konstrukce třídy a jejích instancí by měly
> slouŞit třídy KTI (= konstrukce tříd a instancí) a Volání v projektu
>
> 130z_12_Správce - Statický konstruktor, konstruktor třídy
>
> ke knize OOP - nauÄŤte se myslet a programovat objektovÄ›.
>
> Generátor projektů lze volně stáhnout z adresy
>
> http://knihy.pecinovsky.cz/oopnz/#Programy
>
>
> V tomto projektu sice ještě není pouŞitá dědičnost, ale i tak z něj lze
> leccos pochopit. Doporučuji program za pomoci nějakÊho debuggeru
> prokrokovat a spousta věcí bude jasná i bez čtení příslušnÊ textu v
> učebnici (s ním je to samzřejmě lepší :-)).
>
> --
> Autor: rudyment
> Forum: Java
> Odkaz: http://forum.builder.cz/read.php?14,3336496,3336512#msg-3336512
>


Příspěvek zaslán emailem

Citovat příspěvek

 

Re: dědičnost v javě

Autor: Petr Dopita

16:52:06 09.11.2011

kouknu na to děkuji

Citovat příspěvek

 

Re: dědičnost v javě

Autor: rudyment

16:18:01 09.11.2011

Petr Dopita Napsal:
-------------------------------------------------------
> Ještě otázečka,
> dochází i ke zdědění konstruktoru ze třídy
> BaseClass ?

Všechno tkví v pochopení, že this odkazuje neustále na vytvářený objekt.

Konstruktor BaseClass sice vytváří podobjekt předka, ale this je pro něj to samé jako pro konstruktor potomka, jenom pro něj nejsou přístupné všechny atributy a metody.

Tohle je ukazováno v projektu Matka-Dcera-Vnučka, který je ke stažení jako součást doprovodných programů k učebnici "Myslíme objektově v jazyku Java".

Citovat příspěvek

 

Re: dedicnost v jave

Autor: rudyment

16:10:04 09.11.2011

Asi to budete označovat jako slovíčkaření, ale odmítám označovat první krok kontrukce objektu jako vytvoření objektu. V prvním kroku se neděje nic jiného, než že virtuální stroj alokuje a inicializuje paměť. Objekt vytváří až kontruktor. Dokud kontruktor neskončí svoji práci, nelze považovat objekt za vytvořený.

V učebnicích to přirovnávám k tvorbě hrníčků. Také nebudeme říkat, že hrnek vyrobila příroda, z níž hrnčíř vzal hlínu. Virtuláním strojem alokovaná paměť slouží konstruktoru obdobně jako hlína hrnčíři. Teprve on (hrnčíř, kontruktor) určí výslednou podobu výrobku (objektu) a je zodpovědný za jeho chování.

K demonstraci toho, jak probíhá konstrukce třídy a jejích instancí by měly sloužit třídy [bold]KTI[/bold] (= konstrukce tříd a instancí) a [bold]Volání[/bold] v projektu

130z_12_Správce - Statický konstruktor, konstruktor třídy

ke knize OOP - naučte se myslet a programovat objektově.

Generátor projektů lze volně stáhnout z adresy

[url]http://knihy.pecinovsky.cz/oopnz/#Programy[/url]


V tomto projektu sice ještě není použitá dědičnost, ale i tak z něj lze leccos pochopit. Doporučuji program za pomoci nějakého debuggeru prokrokovat a spousta věcí bude jasná i bez čtení příslušné textu v učebnici (s ním je to samzřejmě lepší :-)).

Citovat příspěvek

 

Re: dedicnost v jave

Autor: Petr Dopita

15:52:10 09.11.2011

Taky jsem to nejprve nemohl přečíst, ale stačí dát kontextové menu pokud jste v IE a změnit kódování na UTF-8, sice to znečitelní další věci na stránce, ale funguje to. Pak to stačívrátit zpět na původní kódování.

Citovat příspěvek

 

Re: dědičnost v javě

Autor: Petr Dopita

15:48:24 09.11.2011

Ještě otázečka,
dochází i ke zdědění konstruktoru ze třídy BaseClass ?

public class BaseClass {
BaseClass() {
[bold]System.out.println(this.toString());[/bold]
showText();
}
public void showText() {
System.out.println("call from base class");
}
public void showText3() {
System.out.println(this.toString());
System.out.println("test");
}
}

protože když přidám do konstruktoru předka řádek System.out.println(this.toString());, tak dostanu ExtendClass@45bab50a. Čili objekt typu ExtendClass.

děkuji

Citovat příspěvek

 

Re: dědičnost v javě

Autor: jimB

15:44:15 09.11.2011

Bohužel nepřečtu co pan tronicek napsal. Pokaždé u jeho příspěvků vidím rozsypaný čaj :)

[bold]Zjednodušeně[/bold] bych odpověděl, že se volá kód v konstruktorech v celé hiearchii postupně od zhora dolů, tzn. od předka po potomky a pořád platí "zákon" polymorfismu!


Jenom jsem tak rychle vygooglil stránku, kde je problematika dědění popsaná. Prolétl jsem ji jen tak zběžně, ale vypadáto, že se vní zkrývají odpovědy na tvé otázky :) ->
[url]http://www.algoritmy.net/article/23665/Dedicnost-12[/url]

Citovat příspěvek

 

Re: dedicnost v jave

Autor: Petr Dopita

15:33:20 09.11.2011

Moc děkuju,
už je mi to jasný, objekt je sice vytvořen, ale nebyl ještě zavolán jeho konstruktor, ten se zavolá až potom co skončí práci konstruktor předka.
Celá věc tedy tkví v tom, že vytvoření objektu a zavolání konstruktoru proběhnou ve dvou krocích.

přesně tohle jsem chtěl vědět a nikde jsem nenašel odpověď.

Citovat příspěvek

 

Re: dedicnost v jave

Autor: tronicek

14:54:15 09.11.2011

Ahoj,

vytvoření objektu a inicializace pomocí konstruktoru jsou v Javě na úrovni
bajtkódu dva oddělenÊ kroky. Výraz new ExtendClass() se tedy do bajtkódu
přeloŞí zhruba takto:
vytvoĹ™ objekt typu ExtendClass
zavolej konstruktor ExtendClass()

V prvním kroku (vytvoření objektu) se alokuje paměť, pak se paměť vynuluje
(tím získají atributy defaultní hodnoty) a vytvoří se vazba na tabulku
metod. Tabulka metod obsahuje adresy všech metod deklarovaných v danÊ
třídě a metod zděděných.

Ve druhÊm kroku se zavolá konstruktor ExtendClass(), který obsahuje jako
první příkaz volání super(). Tento příkaz tam vloŞí překladač, kdyŞ
zjistí, Şe jsme tam ŞádnÊ super() ani this() nenapsali.
Příkaz super() způsobí zavolání konstruktoru předka, tj. BaseClass. No a z
něho zavoláme metodu showText(), která je přepsána ve třídě ExtendClass.

Jak jsi správně odhalil, tato situace můŞe být nebezpečná a proto se
dĹŻraznÄ› doporuÄŤuje volat z konstruktoru pouze metody, kterĂŠ nelze v
potomkovi přepsat. Nejčastěji jsou tyto metody private.

Jinak přesunutím inicializace k deklaraci atributu, tj.

class ExtendClass extends BaseClass {
private String text = "call from extend class";
...
}

si nepomůŞeme, protoŞe přiřazení do proměnnÊ text se provede aŞ po návratu
z konstruktoru BaseClass(). Překladač totiŞ toto přiřazení přesune na
začátek konstruktoru za volání super():

class ExtendClass extends BaseClass {
private String text;
private ExtendClass() {
super();
text = "call from extend class";
...
}
...
}

Z.T.
--
Zdenek Tronicek
FIT CTU in Prague


Petr Dopita napsal(a):
>
>
> Ahoj, začínam programovat a chtěl jsem se zeptat, jak funguje vytváření
> objektĹŻ.
> Jde mi o případ, kdy mám BaseClass a od ní dědí ExtendClass.
>
> public class BaseClass {
> BaseClass() {
> showText();
> }
> public void showText() {
> System.out.println("call from base class");
> }
> public void showText2() {
> System.out.println("test");
> }
> }
>
> class ExtendClass extends BaseClass {
> private String text;
> private ExtendClass() {
> text = "call from extend class";
> System.out.println(text);
> }
> @Override
> public void showText() {
> System.out.println(text);
> }
>
> public static void main(String[] args) {
> BaseClass ovrc = new ExtendClass();
> ovrc.showText();
> ovrc.showText2();
> }
> }
>
> Toto skončí chybou, protoŞe proměnná text není inicializována, coŞ chápu.
> Chápu taky, Şe se děje toto:
> 1. zavolá se konstruktor BaseClass.
> 2. Zavolá se překrytá metoda z ExtendClass, ale konstruktor ExtendsClass
> zatím neproběhl, takŞe proměnná text bude null.
> 3. Proměnná text je null, protŞe nebyla zatím inicializována, ale
> překrytou metodu showText(), zavolat jde, ikdyŞ neproběhl ještě
> konstruktor.
>
> Jak je tedy moŞnÊ, Şe se podaří z konstruktoru předka zovolat metodu z
> konstruktoru potomka ještě před vznikem odvozenÊho objektu ?
> Jak to přesně funguje ?
>
>
> Děkuji
> --
> Autor: Petr Dopita
> Forum: Java
> Odkaz: http://forum.builder.cz/read.php?14,3336496,3336496#msg-3336496
>


Příspěvek zaslán emailem

Citovat příspěvek

 

dědičnost v javě

Autor: Petr Dopita

14:09:42 09.11.2011

Ahoj, začínam programovat a chtěl jsem se zeptat, jak funguje vytváření objektů.
Jde mi o případ, kdy mám BaseClass a od ní dědí ExtendClass.

public class BaseClass {
BaseClass() {
showText();
}
public void showText() {
System.out.println("call from base class");
}
public void showText2() {
System.out.println("test");
}
}

class ExtendClass extends BaseClass {
private String text;
private ExtendClass() {
text = "call from extend class";
System.out.println(text);
}
@Override
public void showText() {
System.out.println(text);
}

public static void main(String[] args) {
BaseClass ovrc = new ExtendClass();
ovrc.showText();
ovrc.showText2();
}
}

Toto skončí chybou, protože proměnná text není inicializována, což chápu.
Chápu taky, že se děje toto:
1. zavolá se konstruktor BaseClass.
2. Zavolá se překrytá metoda z ExtendClass, ale konstruktor ExtendsClass zatím neproběhl, takže proměnná text bude null.
3. Proměnná text je null, protže nebyla zatím inicializována, ale překrytou metodu showText(), zavolat jde, ikdyž neproběhl ještě konstruktor.

Jak je tedy možné, že se podaří z konstruktoru předka zovolat metodu z konstruktoru potomka ještě před vznikem odvozeného objektu ?
Jak to přesně funguje ?


Děkuji

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: