3. Muuttujat

Muuttuja

Muuttuja on muistipaikka, jossa ohjelma voi säilyttää tarvitsemaansa tietoa.

Muuttujan nimi on tunnus, jolla siihen viitataan ohjelmassa. Muuttujan nimessä voi olla kirjaimia (az ja AZ) sekä numeroita (09), mutta nimi ei saa alkaa numerolla.

Muuttujan tyyppi tarkoittaa, millaista tietoa muuttujaan voi tallentaa. Javan tärkeimmät muuttujatyypit ovat seuraavat:

Muuttujan arvo tarkoittaa muuttujan sisältöä tietyllä ohjelman suorituksen hetkellä. Nimensä mukaisesti muuttujan arvo voi muuttua.

Esimerkki

Seuraavassa esimerkissä määritellään muuttujat nimi ja ika. Muuttujien arvoiksi laitetaan "Aapeli" ja 31, minkä jälkeen arvot tulostetaan.

String nimi = "Aapeli";
int ika = 31;
System.out.println(nimi + " on " + ika + " vuotta vanha.");

Ohjelman tulostus on seuraava:

Aapeli on 31 vuotta vanha.

Määrittely

Muuttuja täytyy aina määritellä, ennen kuin sitä voi alkaa käyttää. Määrittelyssä ilmoitetaan muuttujan tyyppi, nimi ja aloitusarvo. Määrittelyn kirjoitustapa on seuraava:

[tyyppi] [nimi] = [aloitusarvo];

Määrittelyn jälkeen muuttujaan voi viitata sille annetulla nimellä. Muuttujan nimi on ohjelmoijan päätettävissä, mutta nimi kannattaa valita kuvaavaksi, jotta siitä näkee muuttujan käyttötarkoituksen.

Muuttaminen

Muuttujan arvoa voi muuttaa seuraavasti:

[nimi] = [uusi arvo];

Muuttujan uuden arvon muodostuksessa voi käyttää sen vanhaa arvoa sekä muiden muuttujien arvoja.

Tarkastellaan seuraavaa ohjelmaa:

int a = 3;
int b = 1;
int c = 8;
a = 4;
b = b + 1;
c = c - 2;
b = 5;
b = a + b;
c = a * b;
a = 2 * b - 3;
System.out.println(a + " " + b + " " + c);

Ohjelman tulostus on seuraava:

15 9 36

Ohjelmassa tapahtuu seuraavaa:

koodiselityslopputulos
int a = 3;
int b = 1;
int c = 8;
muuttujien määrittely a = 3, b = 1, c = 8
a = 4; a saa arvon 4 a = 4, b = 1, c = 8
b = b + 1; b:n arvo kasvaa 1:llä a = 4, b = 2, c = 8
c = c - 2; c:n arvo vähenee 2:lla a = 4, b = 2, c = 6
b = 5; b saa arvon 5 a = 4, b = 5, c = 6
b = a + b; b saa arvokseen a:n ja b:n summan a = 4, b = 9, c = 6
c = a * b; c saa arvokseen a:n ja b:n tulon a = 4, b = 9, c = 36
a = 2 * b - 3; a saa arvokseen 2 * b - 3 a = 15, b = 9, c = 36

Äskeisen esimerkin ymmärtäminen on tärkeää. Älä mene eteenpäin, ennen kuin olet ymmärtänyt kokonaan, mitä ohjelmassa tapahtuu.

Lyhennysmerkintöjä

Tietyt muuttujien muutokset ovat hyvin tavallisia. Javassa ovat käytössä mm. seuraavat lyhennysmerkinnät:

koodilyhennys
a = a + 1a++
a = a - 1a--
a = a + ba += b
a = a - ba -= b

Seuraavat kaksi ohjelmaa toimivat samoin:

koodilyhennys
int a = 2;
a = a + 1;
System.out.println(a);
a = a + 3;
System.out.println(a);
int a = 2;
a++;
System.out.println(a);
a += 3;
System.out.println(a);

Arvo käyttäjältä

Tyypillinen tapa saada muuttujalle arvo on lukea se käyttäjältä. Seuraava komento lukee merkkijonon käyttäjältä:

String merkkijono = input.nextLine();

Kokonaislukujen ja desimaalilukujen lukeminen on hieman vaikeampaa, koska ne pitää muuttaa merkkijonosta lukuarvoiksi. Tämä onnistuu seuraavasti:

int kokonaisluku = Integer.parseInt(input.nextLine());
double desimaaliluku = Double.parseDouble(input.nextLine());

Seuraava ohjelma kysyy käyttäjän nimen ja iän. Sitten ohjelma tulostaa ne uudestaan.

System.out.print("Mikä on nimesi? ");
String nimi = input.nextLine();
System.out.print("Kuinka vanha olet? ");
int ika = Integer.parseInt(input.nextLine());
System.out.println("Nimesi on " + nimi + " ja olet " + ika + " vuotta vanha.");

Ohjelman tulostus voi olla seuraava:

Mikä on nimesi? Aapeli
Kuinka vanha olet? 31
Nimesi on Aapeli ja olet 31 vuotta vanha.

Tässä punaisella kirjoitettu teksti tarkoittaa ohjelman käyttäjän kirjoittamaa tekstiä. Tämä käytäntö jatkuu tulevissa esimerkeissä.

Esimerkki: Tarina

Seuraava ohjelma kysyy käyttäjän nimen ja tulostaa tarinan, jonka päähenkilönä käyttäjä on.

System.out.print("Anna nimesi: ");
String nimi = input.nextLine();
System.out.println();
System.out.println("Syrjäisessä laaksossa asui " + nimi + ",");
System.out.println("joka oli ammatiltaan lammaspaimen.");
System.out.println(nimi + " oli vasta herännyt,");
System.out.println("kun pihaan ratsasti tumma-asuinen ritari.");
System.out.println("Pian " + nimi + " saisi kuulla, että hänet oli");
System.out.println("valittu tärkeään tehtävään...");

Ohjelman tulostus voi olla seuraava:

Anna nimesi: Aapeli

Syrjäisessä laaksossa asui Aapeli,
joka oli ammatiltaan lammaspaimen.
Aapeli oli vasta herännyt,
kun pihaan ratsasti tumma-asuinen ritari.
Pian Aapeli saisi kuulla, että hänet oli
valittu tärkeään tehtävään...

Tai myös seuraava:

Anna nimesi: Maija

Syrjäisessä laaksossa asui Maija,
joka oli ammatiltaan lammaspaimen.
Maija oli vasta herännyt,
kun pihaan ratsasti tumma-asuinen ritari.
Pian Maija saisi kuulla, että hänet oli
valittu tärkeään tehtävään...

Huomaa komento System.out.println ilman tulostettavaa tekstiä: se saa aikaan tyhjän rivin.

Muuttujan tyypin valinta

Mistä tietää, mikä tyyppi on sopiva muuttujalle? Esimerkiksi luvun 12 voi tallentaa merkkijonona, kokonaislukuna ja desimaalilukuna:

String a = "12";
int b = 12;
double c = 12.0;

Muuttujan tyyppi kannattaa valita muuttujan käyttötarkoituksen mukaan. Jos muuttujalla on tarkoitus laskea, lukuarvotyypit ovat luonteva valinta. Jos taas muuttujaa käsitellään tekstin tavoin, sen kannattaa olla merkkijono.

Lukuarvot kannattaa yleensä tallentaa int-tyyppisinä. Vain jos lukuarvoissa tarvitaan desimaaliosaa, double-tyyppi on perusteltu.

Jakolasku

Yhteenlasku, vähennyslasku ja kertolasku toimivat Javassa luonnollisella tavalla, mutta jakolasku saattaa tuottaa yllätyksiä.

Jos jakolaskun molemmat luvut ovat kokonaislukuja, myös tulos on kokonaisluku, vaikka todellisuudessa jako ei menisi tasan. Jos taas ainakin toinen luvuista on desimaaliluku, tulos on desimaaliluku.

Seuraavan koodin toiminta voi yllättää:

int luku1 = 3;
int luku2 = 5;
double tulos = luku1 / luku2;
System.out.println(tulos);

Koodin tulostus on seuraava:

0.0

Vaikka muuttujan tulos tyyppi on double, tuloksen desimaaliosa on kadonnut.

Ratkaisu ongelmaan on muuttaa toinen jakolaskussa olevista luvuista desimaaliluvuksi. Tämän voi tehdä vaikkapa seuraavasti:

double tulos = (double)luku1 / luku2;

Nyt koodin tulostus on haluttu:

0.6

Javan nimeämiskäytäntö

Java-kielessä muuttujat nimetään tavallisesti niin, että muuttujan nimi alkaa pienellä, mutta jos nimessä on monta sanaa, kaikki seuraavat sanat alkavat suurella.

Tähän käytäntöön ei ole mitään syvällistä syytä, mutta se on järkevää omaksua, koska käytännöstä poikkeava koodi näyttää oudolta kokeneen Java-ohjelmoijan silmissä.

Seuraavat muuttujanimet vastaavat käytäntöä: