Helsingin yliopisto / Tietojenkäsittelytieteen laitos
Copyright © 2005 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.

2.7 String-olioita ja char-arvoja

(Muutettu viimeksi 29.9.2009)

Tässä luvussa tutustutaan String-luokkaan ja sen tarjoamiin metodeihin sekä merkkityyppiin char. Ne ovat sinänsäkin hyödyllisiä, mutta ne myös havainnollistavat sitä, miten Java-kielen valmiit välineet on toteutettu luokkina, ja miten ohjelmoija voi ajatella (ja joutuu ajattelemaan!) olioita luokkien ilmentyminä ja operaatioita luokkien metodeina.

String-tyyppi

Java-ohjelmoijalla on automaattisesti käytossään joukko luokkia, jotka on sijoitettu pakkaukseen java.lang. Luokka String on yksi näistä.

Kun kirjoitetaan:

    String jono;
määritellään muuttuja jono, jonka arvoksi voidaan sijoittaa String-tyyppisiä olioita. (Metodin muuttujana jonolla ei ole mitään alkuarvoa, luokan muuttujana alkuarvo on null, erityinen viite "ei-mihinkään-olioon".)

Ilmaus:

    "kissa"
puolestaan tarkoittaa, että luodaan eli konstruoidaan yksi String-tyyppinen olio. Yleensähän oliot luodaan operaatiolla new. Merkintä "kissa" onkin tavallaan vain lyhennysmerkintä ilmaukselle:
 
    new String("kissa")

Luokassa String on siis mm. konstruktori, jonka parametri on String-tyyppiä!

Määrittely:

    String jono = "topi"+"katti";
tarkoittaa yksityiskohtaisesti, että määritellään String-tyyppinen muuttuja jono. Sen alkuarvoksi asetetaan String-olio, joka saadaan, kun ensin luodaan String-oliot "topi" ja "katti" ja sitten nämä katenoimalla luodaan String-olio "topikatti".

Luokka String tarjoaa joukon operaatioita, metodeja, String-arvojen käsittelyyn. Nämä metodit siis ovat String-olioiden aksessoreita ihan samaan tapaan kuin omiin luokkiin on ohjelmoitu aksessoreita.

Omien tyyppien tapaan myös String voidaan nähdä abstraktina tietotyyppinä: Luokan ilmentymän käyttäjä ei tiedä, missä merkkijono sijaitsee ja miten se esitetään muistissa, mutta hän tietää joukon välineitä, joilla arvoja voi käsitellä.

Alkeistyyppi char

Jo tutut tyypit int, double ja boolean ovat ns. alkeistyyppejä (primitive types). Se tarkoittaa, että arvoja käsitellään sellaisinaan, ne eivät ole olioita, niitä ei käsitellä viitteen kautta!

Merkkiarvot (tyyppi char) ovat positiivisia kahden tavun mittaisia kokonaislukuja(!). Merkkivakiot esitetään yksinkertaisissa lainausmerkeissä : 'A', 'k', ' ', '@', ...

[Merkkivakioden ns. heksadesimaaliesitys on muotoa \uXXXX, missä X on heksadesimaaliluku 0-f.]

Merkkiarvon sijoittaminen int-muuttujalle on luvallista, päinvastainen on kiellettyä:

   int i = 7; 
   char c = '#';
   ...
   i = c;  // SALLITTU, i saa arvokseen merkkikoodin!
   c = i;  // KIELLETTY! (tietoa voisi kadota! (char on intiä suppeampi))

Ohjelmanpätkä
   char c = '#';
   int  i = c;  //
   System.out.println("merkkinä: " + c);
   System.out.println("lukuna  : " + i);
tulostaa:
  merkkinä: #
  lukuna  : 35
[int-arvoja voidaan muuttaa ns. eksplisiittisellä tyyppimuunnoksella eli "castilla" char-arvoiksi. Jos tietoa tällöin katoaa, asia on ohjelmoijan vastuulla! Esimerkiksi:
  for (int i=40; i<110; ++i)
    System.out.print( (char)i );
tulostaa rivin:
()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklm
]

Merkkiarvo koodataan ns. Unicode-koodilla, joka sisältää maailman useimpien kirjoitusjärjestelmien kirjain- ja numeromerkit: mm. kreikka, kopti, venäjä, heprea, arabia, devanagari, bengali, gurmukhi, gujarati, tamili, telegu, tai, lao, hiragana, katakana, ...

String-luokan metodeita

Seuraavassa kuvaillaan joitakin String-olioiden käsittelyn välineitä. Täydellinen luettelo String-luokan konstruktoreista ja aksessoreista löytyy String-luokan API-kuvauksesta. Välineitä on paljon. Niitä ei tietenkään tarvitse opetella ulkoa! Kun niitä käytetään, ne "katsotaan API:sta". Seuraavat ovat kuitenkin usein aloittelijallekin käyttökelpoisia.

Huom: Kerran luotua String-oliota ei voi muuttaa, koska luokassa String ei ole ainuttakaan operaatiota String-arvon muuttamiseen. Juuri tällä tavoin - Javan kapselointia käyttäen - luokan String ohjelmoija on toteuttanut päätöksensä, etteivät String-oliot ole muutettavissa!

Kaikki edellä luetellut String-arvoiset metodit luovat aina uuden olion! Merkkijonojen muokkaamiseen käytetään muita välineitä. Niistä myöhemmin.

Kun suoritetaan vaikkapa lauseet

    String jono = "kissa";    // (1)
    jono = jono + " kävelee"; // (2)
luodaan ensin olio "kissa"(1). Sitten luodaan olio " kävelee" ja lopuksi katenoiden olio "kissa kävelee" (2). Koska muuttujan jono vanha arvo korvataan uudella, oliosta "kissa" tulee roska eli siihen ei ole enää viitettä. Samoin " kävelee"-oliolla oli hyvin hetkellinen merkitys. Automaattinen roskienkerääjä aikanaan vapauttaa "kissa"- ja " kävelee"-olioiden varaaman muistialueen muuhun käyttöön.


Takaisin luvun 2 sisällysluetteloon.