Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

9.3.6 Myöhäinen sidonta

Miksi edellä jälkimmäisessä aika.tulosta() kutsussa kutsuttiin luokan AikaSek8 tulosta metodia eikä Aika5 -luokan metodia tulosta. Tai tarkkaan ottaen kutsujärjestys on seuraava:

	main aika=a4;
	-> aika.tulosta();
	-> Aika5.tulosta()
	-> AikaSek8.tulosta(true)  // super.tulosta(false)
	-> Aika5.tulosta(boolean lf)

Eli luokassa AikaSek8 ei ole parametritonta tulosta metodia, siksi kutsutaan luokan Aika5 tulosta-metodia. Tämä taas kutsuu boolean-tyyppisellä parametrilla varustettua tulosta-metodia. Sellainen löytyy siitä oliosta, jota aika tällä hetkellä edustaa, eli luokan AikaSek8 metodi tulosta(boolean lf) . Vastaavasti tämä metodi kutsuu pakotetusti yliluokan metodia super.tulosta(false). Jos sana super oli jäänyt pois, olisi kutsuta seurannut päättymätön rekursio.

Edellä mainittu on toteutettu siten, että alkuperäisessä luokassa kerrotaan että vasta ohjelman suoritusaikana selvitetään mistä luokasta todella on kyse, kun metodia kutsutaan. Tällaista ominaisuutta sanotaan myöhäiseksi sidonnaksi ( late binding) (tälle monisteellekin tulee kyllä myöhäinen sidonta). Vastakohtana tälle on esimerkiksi C++:n oletustapa kutsua metodeja, eli aikainen sidonta ( early binding ). Sidonnan sisäisen mekanismin opettelun jätämme jollekin toiselle kurssille (ks. vaikkapa Olio-ohjelmointi ja C++/VL ).

Javassa kutsutapana on onneksi aina myöhäinen sidonta, koska muuten perinnässä ei ole oikein mieltä.

Kun aliluokaan kirjoitetaan vastaava metodi kuin yliluokassa, käytetään tästä termiä uudelleenmäärittäminen (korvaaminen, syrjäyttäminen, overriding).

Tehtävä 9.10 Miksi vielä yksi lisaa-kutsu?

Osaatko selittää miksi aseta-metodissa pitää olla kutsut this.s = s; super.aseta(h,m); lisaa(0,0); ? Jos osaat, olet jo melkein valmis Java-ohjelmoija!

Tehtävä 9.11 Ei turhaa lisaa-kutsua

Mitä tarvitsee muuttaa jotta viimeinen lisaa-kutsu saadaan pois?

Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys