Muuttuja on muistipaikka, jossa ohjelma voi säilyttää tarvitsemaansa tietoa.
Muuttujan nimi on tunnus, jolla siihen viitataan ohjelmassa.
Muuttujan nimessä voi olla kirjaimia (a
–z
ja
A
–Z
) sekä numeroita
(0
–9
), mutta nimi ei saa alkaa numerolla.
Muuttujan tyyppi tarkoittaa, millaista tietoa muuttujaan voi tallentaa. Javan tärkeimmät muuttujatyypit ovat seuraavat:
String
: merkkijono eli tekstiä (esim. "Aapeli"
)
int
: kokonaisluku (esim. 123
)
double
: desimaaliluku (esim. 3.14159
)
Muuttujan arvo tarkoittaa muuttujan sisältöä tietyllä ohjelman suorituksen hetkellä. Nimensä mukaisesti muuttujan arvo voi muuttua.
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.
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.
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:
koodi | selitys | lopputulos |
---|---|---|
int a = 3;
|
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.
Tietyt muuttujien muutokset ovat hyvin tavallisia. Javassa ovat käytössä mm. seuraavat lyhennysmerkinnät:
koodi | lyhennys |
---|---|
a = a + 1 | a++ |
a = a - 1 | a-- |
a = a + b | a += b |
a = a - b | a -= b |
Seuraavat kaksi ohjelmaa toimivat samoin:
koodi | lyhennys |
---|---|
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); |
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ä.
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.
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.
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
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öä:
pelaajanNimi
pistemaara
toiseksiSuurinLuku