Helsingin yliopisto / Tietojenkäsittelytieteen laitos / 581258-1 Johdatus ohjelmointiin
Copyright © 2007 Arto Wikla. Tämän oppimateriaalin käyttö on sallittu vain yksityishenkilöille opiskelutarkoituksissa. Materiaalin käyttö muihin tarkoituksiin, kuten kaupallisilla tai muilla kursseilla, on kielletty.

3.2 Alkeistyyppejä ja literaalivakioita

(Muutettu viimeksi 24.10.2007)

Javassa tyypit jaetaan

Tässä kappaleessa käsitellään alkeistyyppejä. Viittaustyyppisiä arvoja eli olioita käsitellään luvuissa 2.6 ja 4.

Kaikkia tyyppejä voi tuttujen tyyppien tapaan käyttää muuttujien määrittelemisessä, muodollisen parametrin tyypinä, metodin tyyppinä, ...

Literaalivakioilla tarkoitetaan ohjelmatekstiin kirjoitettuja vakioita, esim. 1, 3.14, true, ..., joilla ei ole nimeä. Ne siis ymmärretään "kirjaimellisesti".

Nimetyt vakiot ovat "muuttujia, jotka on määritelty muuttumattomiksi", esimerkiksi

   final int VAKIOLUKU = 12345;
Nimettyjä vakiota käsitellään luvussa 4.2.

Totuusarvotyyppi boolean

Arvoalue (ja literaalivakiot): true, false

Huom: Javassa boolean ei ole kokonaisluku eikä kokonaisluku ole boolean (esim. C:n tapaan; Javassa numeerisen arvon voi muuttaa totuusarvoksi esim. vertailulla x!=0).

Kokonaislukutyypit

Kokonaislukuarvot (paitsi char) esitetään tietokoneessa ns. 2-komplementtimuodossa. Laskutoimitusten mahdollisesti aiheuttamaa ns. ylivuotoa tai alivuotoa ei havaita!

Literaalivakiot kirjoitetaan tuttuun tapaan: 1, -54, 0, ...

[Ns. oktaali- ja heksadesimaaliarvoille on oma esitysmuotonsa. On paras olla käyttämättä 'tarpeettomia' etunollia, jos ei erityisesti pidä oktaaliluvuista! Myös long-vakioille on oma esitysmuotonsa: 34L]

Erityyppisten kokonaislukuarvojen sekoittaminen ei aina ole ongelmatonta. Luvussa 3.3 opitaan miten kokonaislukutyyppien arvoja voi muuttaa toisikseen.

Merkkityyppi char

Merkkiarvot (char) ovat positiivisia kahden tavun mittaisia kokonaislukuja. Merkit on koodattu Unicode-koodilla, joka sisältää maailman useimpien kirjoitusjärjestelmien kirjain- ja numeromerkit. Esitettävissä ovat esimerkiksi mm. seuraavien kielten merkistö: kreikka, kopti, venäjä, heprea, arabia, devanagari, bengali, gurmukhi, gujarati, tamili, telegu, tai, lao, hiragana, katakana, ...

Merkkivakiot esitetään yksinkertaisissa lainausmerkeissä, esimerkiksi: 'A', 'k', ' ', ';', '#', ... . (Kaksoislainausmerkit on varattu String-tyyppisille vakioille!)

Eräille erikoismerkeille on erityiset ilmaukset:

          '\b'     backspace 
          '\t'     tabulaattori (tab)
          '\n'     rivinvaihto (lf)
          '\f'     sivunvaihto (ff)
          '\r'     telanpalautus (cr)
          '\"'     kaksinkertainen lainausmerkki
          '\''     yksinkertainen lainausmerkki
          '\\'     takakenoviiva
          '\ddd'   merkki, jonka koodi oktaalilukuna on ddd
          '\udddd' Unicode-merkki, jonka koodi hekdadesimaali-
                   lukuna on dddd 
Huom: Näitä ilmauksia voi käyttää myös String-vakioissa!
Huom: '\u0000' on ns. null-merkki. Jos se esimerkiksi tulostetaan, mitään ei näy...

Liukulukutyypit

Javan liukulukutyypit ovat: Liukulukuliteraalit ovat muotoa: 3.14, 124., .12, 5.6e3, 0.3E-9, 3e-10, 1.8e+3, ...

Huom: Kaikki liukulukuliteraalit ovat oletusarvoisesti tyyppiä double! Vakion saa float-tyyppiseksi kirjoittamalla sen loppuun kirjaimen f tai F: 3.14f, 124.F, .12F, 5.6e3f, 0.3E-9f, ...

(Javan liukulukuaritmetiikka (lähes!) noudattaa standardia IEEE 754.)

(Liukulukujen arvoalueeseen kuuluvat myös positiivinen ja negatiivinen ääretön ja erityinen NaN-arvo, "not a number". Näiden avulla pidetään mm. huoli siitä, että alilausekkeen laskennassa tullut "huono" arvo tekee koko lausekkeen arvon "huonoksi". Tällä kurssilla ei numeerisen laskennan periaatteita käsitellä!)

Lueteltu tyyppi (Enumerated type)

Java 1.5:een tuli odotettu uutuus, arvoalue joka muodostetaan itse luetelluista tunnuksista. Näin vältytään koodaamasta tuollaisia arvoja vaikkapa kokonaisluvuin, ja tyyppiturvallisuus lisääntyy.

Pieni esimerkki:

public class Kortti {

  public enum Arvo { KAKKONEN, KOLMONEN, NELONEN, VITONEN,
                     KUTONEN, SEISKA, KASI, YSI, KYMPPI,
                     JÄTKÄ, ROUVA, KUNKKU, ÄSSÄ }

  public enum Maa  { RISTI, HERTTA, PATA, RUUTU }

  public static void main(String[] args) {

    // for-each-läpikäynti
    for (Maa maa : Maa.values())
      for (Arvo arvo : Arvo.values())
         System.out.println("" + maa + arvo);

    // switch-lause
    for (Maa maa : Maa.values())
      switch (maa) {
        case RISTI: case PATA:
          System.out.println(maa + " on musta.");
          break;
        case HERTTA: case RUUTU:
          System.out.println(maa + " on punainen.");
          break;
      }
  }
}
Javan uutuus on paljon vahvempi kuin esimerkiksi C:n ja Pascalin vastaava rakenne - oliotekniikka on otettu mukaan peliin! Lisää tietoa löytyy Sunin sivulta. Tällä kurssilla lueteltuun tyyppiin ei ehditä perehtyä.


Takaisin luvun 3 sisällysluetteloon.