Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

8.4.5 Viitteeseen sijoittaminen

Jos sijoitetaan "olio" toiseen "olioon", niin tosiasiassa sijoitetaan viitemuuttujien arvoja, eli sijoituksen s2 = s1 jälkeen molemmat merkkijono-olioviitteet "osoittavat" samaan olioon.


Kuva 8.2 Kaksi viitettä samaan olioon

Sijoituksen jälkeen kuvassa muistipakkaan 8040 ei osoita (viittaa) enää kukaan ja tuo muistipaikka muuttuu "roskaksi". Kun Javan roskienkeruu ( garbage-collection, gc) seuraavan kerran käynnistyy, "vapautetaan" tällaiset käyttämättömät muistialueet. Tätä automaattista roskienkeruuta on pidetty yhtenä syynä Javan menestykseen. Samalla täytyy kuitenkin varoittaa että muisti on vain yksi resurssi ja Javassa on automatiikka vain muistin hoitamiseksi. Muut resurssit kuten esimerkiksi tiedostot ja tietokannat pitää edelleen hoitaa samalla huolellisuudella kuin muissakin kielissä. Jopa C++:aa huolellisemmin, koska Javassa ei ole C++:n tapaan automaattisia olioita.

Javan viitemuuttuja voidaan siis laittaa "osoittamaan" milloin tahansa toista oliota.  Tämä tapahtuu sijoittamalla viitemuuttujaan joko olemassa olevan olion viite 
	    s2 = s1;    // laitetaan s2 viittaamaan samaan paikkaan kuin s1

tai luomalla uusi olio,

	    String s2 = new String("eka");  // laitetaan s2 viittaamaan uuteen olioon

jolloin new-operaattorin palauttama viite sijoitetaan. Käytännössä Javan viitteet ovat siis oikeastaan osoittimia. Javan viitteillä ei kuitenkaan voi "edetä" C++:n osoittimien tapaan (esim. s1++). Tämä osoitinaritmetiikan puute on toinen Javan hyväksi puoleksi usein mainostettu ominaisuus (tosin ääneen tämä sanotaan "Javassa ei ole osoittimia", lisäksi on tosin totta että Javassa ei todellakaan ole viitteitä tai osoittimia primitiivityyppeihin).


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys