Syyhypulverinperintöprinssikokelaskaniinimaniakkerihakkeritrallallaa
Mureakuha
Tämä artikkeli kaipaa lisätarkistusta kirjoitukseen ja tarkennusta ilmauksiin.
Arvon tallentaminen
Kääntäjä muuntaa muuttujan nimen osoitteeksi, josta ohjelmoijan ei tarvitse välittää. Eli kirjoittamassasi koodissa esim. muuttuja ika voisi muuttua osoitteeksi 66060, johon tallennat int tyyppisen arvon 74 esimerkiksi. Tällöin tuo arvo 74 tallennetaan muistiin kohtaan 66060. Tästä johtuen perustietotyypin viitteen välittäminen on javassa vaikeaa tai jopa mahdotonta, koska
int ika = 74; int ika2 = ika; ika++;
edellisen koodin ika muuttujan muuttuisi osoitteeksi 66060 ja ika2 osoitteeksi 66064. Nyt muuttujaan 66060 tallennettaisiin arvo 74 ja seuraavalla rivillä kopioitaisiin kyseinen arvo muistissa kohtaan 66064. Lopussa oleva ika++ kasvattaisi arvoa yhdellä muistissa kohdassa 66060 ja muistin kohta 66064 säilyisi edelleen koskemattomana.
Viittauksen tallentaminen
IkaLuokka ika = new IkaLuokka(74); IkaLuokka ika2 = ika; ika.arvo++;
Muutetaan aikaisempaa ratkaisua siten, että tehdään IkaLuokka, joka kapseloi int perustyypin arvo nimiseen muuttujaan. Ensimmäisellä rivillä luodaan muuttuja ika, jonka osoite on edelleen 66060 ja ika2:n osoite 66064.
Ensimmäisellä rivillä luodaan myös ei perustyypin olio, jonka java automaattisesti tallentaa kekoon, jolloin olion tiedot tallennetaankiin esim. muistipaikkaan 123456, jotta oliota voidaan käsitellä tallennetaan sen viittaus/osoite muuttujaan ika, jonka jälkeen muistissa kohdassa 66060 on arvo 123456.
Seuraavalla rivillä kopioidaan muuttujan ika arvo muuttujaan ika2 eli muisipaikasta 66060 arvo 123456 kopioidaan kohtaan 66064 samanlaisena. Tämän jälkeen viimmeisellä rivillä kutustaan ika muuttujaan tallennettua oliota ja kasvatetaan olion arvo muuttujan arvoa yhdellä, joka muuttaa arvon muistipaikassa 123465:ssa arvoon 75.
Tästä johtuen molemmat muuttujat sekä ika ja ika2 antavat arvoksi 75, koska viittaavat muistissa paikkaan 123456.
