Opi JAVA

Viimeinen muutos 04.10.2001

Kirjoittanut Antti Veräjänkorva

Versio 1.4

 

JOHDANTO

 

Java kieli on hyvin kannattava kieli opiskella, koska sen käyttö Internetissä tulee varmasti yleistymään yhä enemmän. Nopeampien yhteyksien myötä tulee enemmän Java-appletteja. Javassa on hyviä ominaisuuksia ja ehkä kaikkein tärkein niistä on pohjasta riippumattomuus. Tämä on erittäin tärkeää varsinkin Internetissä, jossa käyttäjillä on eri laitteisto kokoonpanoja. Javan heikkous on sen hitaus, jonka pohjasta riippumattomuus tuo tullessaan. Hitautensa takia Java-appletteja ei juuri näy ’vielä’. Tämänkin takia Java on hyvin järkevä ohjelmointi vaihtoehto, koska silloin kun Javaa netissä aletaan käyttämään oikein toden teolla, on sinulla taito osata ohjelmoida kyseisellä kielellä.

   Javalla voidaan ohjelmoida myös itsenäisiä ohjelmia. Nämä ohjelmat eivät siis tarvitse mikään laista Internetselainta (IE, Netscape), kuten Java-appletit. Varsinaista exe-tiedostoa ei Javan kääntäjä tee, mutta ohjelmien ajo onnistuu käskyllä ’Java [tiedoston nimi]’. Ohjelma on Javan tulkki, joka ajaa ohjelman. Appletteja voidaan siis ajaa internet selaimella, mutta myös ilman. Applet Viewer on ohjelma mikä simuloi internet selainta. Applet Viewer ohjelmalla onnistuu siis applettien ajo vai pitäisikö puhua testauksesta. Internetselaimessa moista käskyä ei tietenkään tarvita vaan appletti saadaan sivulle tietyllä koodiriveillä, jotka ovat seuraavat.

 

<applet code="alkuun.class"

                      width="320"

                      height="240">

</applet> 

 

Java ohjelmien lataamisesta ja kääntämisestä tulee vielä lisää tietoa, myöhemmin tutoriaalissa. Kyseiset operaatiot ovat yksinkertaisia ja helppoja.

 

   Tutoriaalin oppien sisäistäminen ei edellytä aikaisempaa ohjelmointi kokemusta eikä kovinkaan kummoista tietokone osaamista. Tietokoneen käytön perusteet ja HTML kielen perusteet olisi kuitenkin hyvä osata.

 

1.0  Java alkeet vähän syvemmin

1.1  Kommentit

1.2  Muuttujat

1.3  Muuttuja tyypit

1.4  Operaattorit

1.5  Ehtolauseet

1.6  Toistolauseet

1.7  Taulukot

1.8  STRING-olio

2.0  Oliot

2.1  Mikä on olio

2.2  Kuinka olioita käytetään

2.3  Perintä

2.4  Koostaminen

2.5  Metodit

2.6  Rajapinnat

3.0  Käyttöliittymä

3.1  BUTTON

3.2  LABEL

3.3  SCROLLBAR

3.4  CHECKBOX

3.5  TEXTFIELD

3.6  TEXTAREA

3.7  CHOICE

3.8  LIST

4.0  Pohjat eli Layout

4.1  PANEL

4.2  FLOWLAYOUT

4.3  CARDLAYOUT

4.4  BORDERLAYOUT

4.5  GRIDLAYOUT

4.6  GRIDBAGLAYOUT

5.0  Ikkunat

5.1  Ikkuna

5.2  Dialogi

6.0  Grafiikka

6.1  Erilaisia geometrisia kuvioita

6.2  Kuvat verkosta

7.0  Kiitos

 

 

Javan aivan alkeet

 

   Java kieli on helppo oppia, jos olet aiemmin koodannut vaikka C/C++ kielillä. Toki C/C++ kieletkin ovat helppo oppia Javan jälkeen. Ohjelmointi kokemusta ei kuitenkaan tarvita vaan kaikki asiat käydään läpi.

   Tässä luvussa tehdään yksinkertainen Java ohjelma, applettina ja itsenäisenä ohjelmana. Luvussa tutustutaan myös ohjelmien kääntämiseen ja niiden ajamiseen.

 

   Terve maailma

 

Jos olet lukenut jonkin ohjelmointi kirjan olet törmännyt riviin ’terve maailma tai hello world’. Seuraava harjoitus on varmasti eniten koodattu ohjelma maailmassa tai ainakin melkein. Ohjelman nimi on yllättäen terve maailma. Ohjelma tulostaa näyttöön rivin missä lukee terve maailma. Tässä ohjelmassa sanonta ’yksinkertainen on hienoa’ ei todellakaan pidä paikkaansa. Ohjelma on kyllä yksinkertainen, mutta säälittävän näköinen.

   Ensimmäinen homma kun alat kirjoittaa ohjelmaa on, että avaat jonkin teksti editorin (notpad). Kirjoittaessasi koodia on muistettava pari asiaa.

 

-         Älä käytä lihavointia tai muita tyyliominaisuuksia

-         Älä vaihtele fontteja.

-         Teksti pitää tallentaa ASCII muotoon.

-         Java ohjelman tai appletin pääte on oltava java. Eli näin ohjelma.java

 

Siinä oli ensimmäiset asiat jotka pölähti mieleen.

 

   Noin nyt kun tiedämme miten kirjaimia ruutuun hakataan niin voimmekin aloittaa pikku, pikku ohjelmamme.

 

/* Tämä ohjelma

    kirjoittaa ruutuun tekstin. */

 

import java.applet.*;

import java.awt.*;

 

public class text extends Applet

{

 

 public void init() {

 

     setBackground(Color.white);                   

    }

 

 public void paint(Graphics g) {

 

      g.drawString("Terve maailma !!!", 10, 10);

     }

 

}

 

Yllä oleva koodi on appletti eli sitä on mahdollista käyttää vain selaimessa. Nyt kun ohjelma on valmis voimme tallentaa ja kääntää sen.

 

   Ohjelma pitää tallentaa java pääteiseksi. Eli tallenna ohjelma terve.java nimiseksi.

 

   Ohjelma käännettään niin, että avaat ensin Dos promptin ja kirjoitat seuraavan rivin.

Javac terve.java

 

   Javac on Javan kääntäjä eli se tekee koodista toimivan ohjelman. Kuitenkin ennen kuin Javac voi toimia joka puolella konetta pitää autoexec.bat tiedostoa muuttaa. Autoexec.bat tiedosto on C-aseman juuressa. Kirjoita C-aseman juuressa edit autoexec.bat. Kirjoita sinne uusi rivi, joka kuuluu näin. SET PATH=Java kääntäjän paikka eli polku. Nyt olet valmis.

 

   Koska odotat jo malttamattomasti milloin näet mitä tuo ohjelma tekee niin näytetään se nyt. Tee nettisivu. Eli avaa sama teksti editori jolla teet Java ohjelmia ja kirjoita seuraavat rivit.

<HTML>

   <HEAD>

     <TITLE>Terve maailma</TITLE>

   </HEAD>

   <BODY>

 

<applet code="terve.class"

                                            width="320"

                                            height="240">

</applet> 

 

    </BODY>

</HTML>

 

Tallenna koodi nimellä index.html ja klikkaa syntynyttä tiedostoa.

 

Nyt nettisivulla on hieno Java-appletti. Eli sivulla lukee ’Terve maailma’.

 

   Nyt katsotaan mitä kaikki tuo koodi oikein tarkoittaa. Tässä kannattaa nyt olla tarkkoina, koska tätä tietoa tullaan tarvitsemaan koko ajan kun Javaa ohjelmoidaan. Ensimmäiset rivit :

  import java.applet.*;

  import java.awt.*;

Tarkoittavat sitä, että luokalle tuodaan applet ja awt paketit. Rivien perässä on merkit .*;. Javassa jokainen käsky loppuu ;-merkkiin ja .* tarkoittavat, että luokka saa myös awt ja applet pakettien alipaketit. Paketit ovat joukko luokkia, jotka on pakattu pakettiin.

Seuraavaksi rivi public class text extends Applet.

Rivi tarkoittaa, että luokan on julkinen ja luokan nimi on text. Luokka perii myös Applet luokalta.

 

{}-merkkejä Javassa käytetään koodin rajaamiseen (Pascal kielessä vastaavat ovat BEGIN JA END).

public void init() {.

Appletin suoritus alkaa tästä metodista. Se siis pitää löytyä jokaisesta appletista. Metodissa määritellään taustaväri rivillä setBackground(Color.white);

 

Piirto-metodi määritellään tällaisella rivillä public void paint(Graphics g) {

Eli tuo tarkoittaa, että metodi on julkinen se ei palauta mitään arvoa ja luokan nimi on paint.

g.drawString("Terve maailma !!!", 10, 10);  

Tämä rivi sitten tulosti tekstin appletiin, kohtaan X10 ja Y10.

 

   Tuossa tulikin sitten kerrottua riviriviltä mitä koodi tarkoitti. No tällaista selitys muotoa ei tulla enää näkemään, koska se on mukavan työläs isommissa ohjelmissa.

Ja tuli vissiin luvattua, että tuosta rakennellaan myös itsenäinen versio eli.

 

public class text

{

 public static void main(String args[])

 {

   System.out.println("Terve maailma !!!");

 }

}

Koodi teki vähän niin kuin aiempikin, mutta vain DOS puolella. Eli selvitellään mitä koodi tarkoitti. Luokan määrittely onkin jo selvä. Metodissa sen sijaan löytyy uusi sana ja se STATIC. Tämä tarkoitta, että metodin jakavat kaikki luokan ilmentymät (tätä voi käyttää myös muuttujissa).

Seuraava outo rivi onkin tulostus rivi. Teksti tulostamiseen käytetään System.out luokan println()-metodia. Siinä se eikä varmasti ollut vaikeaa, mutta älä huoli kyllä se vaikea paikkakin vielä tulee vastaan.

 

Kun olet kääntänyt ohjelman voit ajaa sen kirjoittamalla DOS-promptiin seuraavaan komentorivin.

 

JAVAC ohjelman nimi.java

 

   Nyt kun olemme ihastelleet hienoa ohjelmaamme riittävän pitkään niin siirrytään eteenpäin. Nyt pääsemme jo lukuun jossa on numerokin.

 

1.0  Java alkeet vähän syvemmin

 

   Javassa on enemmänkin tiedettävää kuin aiemmin esitellyt jutut. Nyt tässä luvussa käydään läpi monia asioita mm.

-         Kommentit

-         Muuttujat

-         Muuttuja tyypit

Kaikki mainitut asiat on oltava hallussa, jotta voisit rakennella kunnollisia sovelluksia. Kommenttien tärkeys on hyvin merkittävä varsinkin yritys ympäristössä.

 

   1.1 Kommentit

 

   Kommentti on koodin joukossa oleva teksti, mikä ei vaikuta tulevaan ohjelmaan. Vaan se on ainoastaan ohjelmoijaa varten oleva muistiteksti. Javan kääntäjä jättää automaattisesti moiset tekstit huomiotta eli niitä voi kirjoitella mielin määrin koodin sekaan.

 

// Kommentti

 

Yllä on yksi vaihtoehto tehdä kommentti. Merkit // ovat sen merkki, että kaikki noiden merkkien jälkeen, samalla rivillä oleva teksti on kommenttia.

On olemassa myös toinen mahdollisuus kommentin tekoon. Merkit /* */ sulkevat sisäänsä kommentin.

 

/* Tämä on

         kommentti kahdella rivillä. */

 

Kommentteja kanttaa käyttää aina kun muistaa, jaksaa tai viitsii. Kommentoiminen on erittäin tärkeää varsinkin kun annat koodisi jollekin toiselle jatkokehitykseen. Toisen tekemää kommentoimatonta koodia on kamala lukea ja yrittää selvittää mitä se tekee missäkin.

 

 

 

   1.2 Muuttujat

 

   Muuttujia käytetään tiedon tallentamiseen. Tieto pysyy muuttujassa (muistipaikka) niin kauan kunnes ohjelma on päällä tai jos muuttujan arvoa ei muuteta. Muuttujien käyttö on lähes pakollista kun koodaamme ohjelmia millä tahansa ohjelmointi kielellä. C kieltä tai C++ kieltä koodanneet voivat heittää hellät hyvästit osoitin muuttujille. Niitä ei meinaan vastaan tule.

 

   1.3 Muuttuja tyypit

 

   Muuttujia on monia eri tyyppisiä. Eri tyyppisiin muuttujiin voidaan tallentaa vain muuttujan tyyppistä dataa. Seuraavassa Javan muuttuja tyypit :

 

Tyyppi

Käyttötarkoitus   

Koko biteissä

BYTE

Tavuja

8

SHORT

Pieniin kokonaislukuihin

16

CHAR

Unicode-merkkejä

16

INT

Normaalit kokonaisluvut

32

LONG

Isot kokonaisluvut

64

FLOAT

Liukuluvut

32

DOUBLE

Tarkemmat liukuluvut

64

 

Jos ihmettelet missä on STRING, niin se ei kuulu muuttujiin. Javassa merkkijonot ovat olioita. Tämän takia ei kannata loikata alas parvekkeelta, koska se ei vaikeuta asioita mitenkään. No STRING oliosta lisää myöhemmin.

 

   1.4 Operaattorit

 

   Javassa on monenlaisia operaattoreita. Käymme nyt läpi nämä operaattorit. Javassa operaattoreita käytetään sijoittamaan arvoja, vertailuun, laskutoimituksiin, yms.

 

Sijoitusoperaattori

  

   Tätä käytetään annettaessa muuttujalle arvo.

 

int = 0; // Tässä on sijoitusoperaattori

 

Vertailuoperaattorit

 

   Vertailuoperaattoreilla vertaillaan arvoja keskenään. Näitä käytetään useimmiten ehto- ja toistolauseissa. Operaattori palauttaa, myös TRUE arvon jos kyseinen tehtävä on tosi ja FALSE jos tehtävä ei ole tosi.

 

==

Yhtä suuri

!=

Eri suuri

<

Pienempi kuin

>

Suurempi kuin

<=

Pienempi tai yhtä suuri kuin

>=

Suurempi tai yhtä suuri kuin

 

Emme ole käyneet vielä läpi ehtolausetta, mutta siitä tulee nyt kuitenkin esimerkki.

 

public class luku

{

 public static void main(String args[])

 {

  int luku = 10; // Sijoitusoperaattori =

 

  if (luku < 10) // Vertailuoperaattori <

   System.out.println("Joo luku on pienempi kuin 10.");

  else

   System.out.println("Luku ei ole pienempi kuin 10.");

 }

}

 

   Loogiset operaattorit

 

   Näitä operaattoreita tarvitaan kun halutaan vertailla enemmän kuin kaksi lukua samassa ehtolauseessa. Äskeinen selitys oli kyllä niin heikko, että otamme heti pienen taulukon ja esimerkin.

!

EI

&&

JA

||

TAI

 

Ja nyt sitten esimerkki aiheesta.

 

  if ((luku < 10) && (luku > 0) // Looginen operaattori && eli JA.

 

   Aritmeettiset operaattorit

 

   Nämä operaattorit ovat tuttuja laskutoimituksia. Niitä tarvitaan luonnollisesti laskujen laskentaan. Eli operaattorit ovat seuraavat.

 

+

Yhteenlasku

-

Vähennyslasku

/

Jakolasku

*

Kertolasku

%

Jakojäännös

 

 

 

 

   Muunto operaatiot

  

   Muunto operaattoreita käytetään yleensä lisäämään tai vähentämään jostain luvusta 1. Yleinen käyttökohde on silmukat. Eli operaattorit ovat.

 

++

Lisää yksi

--

Vähennä yksi

-=

Vähennä luku

+=

Lisää luku

*=

Kerro luku

/=

Jaa luku

 

 

   Bittitason operaattorit

 

   Näitä käytetään vain bittitasolla. Usein näkee bittioperaatioita käytettävän Grafiikka ohjelmoinnissa.

 

<<

Siirrä vasemmalle

>>

Siirrä oikealle

&

JA

|

TAI

^

XOR

~

EI

 

Bittitason operaattorit ovatkin sitten muita operaattoreita konstikkaampia. Näitä ei tarvita useinkaan ainakaan alussa. Eli se siitä. Käymme bittitason operaattoreita läpi tutoriaalissa ”Grafiikkaa Javalla”.

 

   1.5 Ehtolauseet

 

   Ehtolauseita tarvitaan ohjelmissa yleensä paljon, koska niillä ohjaillaan paljolti ohjelman osien suoritus järjestystä. Niiden nimen omainen tarkoitus on katsoa onko ehto tosi vain ei.

 

   If lause

 

   Ehtolause Javassa on IF. Eli pieni esimerkki if lauseesta.

 

  if (luku < 10)

  // Koodia 1

 else

  // Koodia 2

 

IF-lause suorittaa koodia 1 kohdan jos ehto pitää paikkansa eli luku on pienempi kuin 10. ELSE tarkoittaa sitä, että jos ehto ei ole tosi niin tämän jälkeinen kohta suoritetaan eli koodia 2.

Suoritettavat koodit voidaan kirjoittaa {}-merkkien väliin jolloin merkkien välissä oleva koodi kuulu sille ehdolle jonka jälkeen merkit kirjoitetaan. Seuraavassa esimerkki tästä.

 

  if (luku < 10) {

  // Koodia 1

  // Koodia lisää

}

 else {

  // Koodia 2

  // Koodia lisää

}

 

Ehtolauseen kanssa voidaan käyttää mukavasti loogisia operaattoreita kuten aiemmin näimme. Siltä varalta, että olet sen unohtanut tai epähuomiossa jättänyt huomiotta niin tässä esimerkki.

 

  if ( (luku < 10) && (luku > 0) ) {

  // Koodia 1

  // Koodia lisää

}

 else {

  // Koodia 2

  // Koodia lisää

}

 

Näin saadaan helposti rajattua vaikka alueita ruudulta, mutta tästä lisää tutoriaalissa ”Grafiikkaa Javalla”. Ehtolauseita kannattaa treenata, koska ohjelman toiminta on pitkälti kiinni ehtolauseista. Lopuksi vielä pieni esimerkki.

 

public class luku

{

 public static void main(String args[])

 {

  int luku = 10;

 

  if (luku != 10)

   System.out.println("Joo luku on erisuuri kuin 10.");

  else

   System.out.println("Luku ei ole erisuuri kuin 10.");

 }

}

 

   Switch

 

   Javassa on toinenkin ehtolause SWITCH. Tämä ehto lause ottaa numeron ja vertaa CASE kohdan perässä olevaan arvoon ja jos se täsmää niin suoritetaan koodia seuraavaan BREAK kohtaan saakka.

 

public class text

{

 public static void main(String args[])

 {

  int luku=1;

 

   switch (luku)

   {

      case 1:

            luku = 50;

      break;

 

      case 2:

            luku = 100;

      break;

   }

 

   System.out.println("Luku on "+luku);

 }

}

 

   1.6 Toistolauseet

 

   Toistolauseet ovat erittäin tärkeitä kaikissa ohjelmissa. Eivät ihan niin tärkeitä kuin ehtolauseet, mutta melkein. Toistolauseilla voidaan toistaa jotain ohjelman osaa halutun monta kertaa. Toistojen kanssa saadaan pienellä pähkinällä aikaan mielenkiintoisia juttuja.

 

   For lause

 

   Nyt kuitenkin pysymme ihan perusteissa ja teemme vain pikku toiston (loop), joka tulostaa ruutuun numerot 1:stä 10:neen. Ohjelma on hyvä harjoitus ja siinä tuleekin esille monia läpikäytyjä asioita eli, jos sisäistät tämän olet jo jyvällä Java ohjelmoinnissa.

Tässä on nyt sitten ohjelma mikä tulostaa numerot 0-10.

 

public class luku

{

 public static void main(String args[])

 {

  int luku=0;

 

   for (luku = 0; luku<11; luku++)

      System.out.println("Luku on "+luku);

 }

}

 

Javassa on enemmänkin toistolauseita kuin yksi. Käymme nyt läpi WHILE lauseen

 

   While lause

 

WHILE on aivan yhtä yksinkertainen kuin FOR lausekin. WHILE lausetta toistetaan niin kauan kuin ehto on tosi.

 

public class luku

{

 public static void main(String args[])

 {

  int luku=0;

 

  while (luku < 11) {

   System.out.println("Luku on "+luku);

   luku ++; }

 }

}

 

Äskeinen koodi tulostaa numerot 0:sta 10:neen.

 

   Taulukot 1.7

 

   Taulukot ovat erittäin hyödyllisiä pikku ominaisuuksia. Niihin voidaan ladata tietoa aivan kuin muuttujiin, mutta taulukkoon voi ladata monta eri arvoa. Eri arvoja kutsutaan taulukon solun INDEX numerolla.

 

Muodostan nyt taulukon jossa on 10 solua. Jokainen solu saa eri numero arvon. Ihan lopuksi numerot tulostetaan ruutuun.

 

public class taulukko

{

 public static void main(String args[])

 {

  int[] taulukko = new int[10];

 

  for (int i=0; i < 10; i++)

    taulukko[i] = i;

 

    for (int i=0; i<10; i++)

        System.out.println("Luku on "+taulukko[i]);

 }

}

 

Taulukoista voidaan muodostaa myös moniulotteisia.

 

int[][] taulukko = new int[10][10];

 

Nyt voimme laskea taulukkoon vaikka kertotaulun.

 

public class taulukko

{

 public static void main(String args[])

 {

  int[][] taulukko = new int[10][10];

 

  for (int i=0; i < 10; i++)

   for (int j=0; j < 10; j++)

    taulukko[i][j] = i*j;

 

    for (int i=0; i<10; i++)

      for (int j=0; j < 10; j++)

        System.out.println("Luku on "+taulukko[i][j]);

 }

}

 

Moniulotteisia taulukoita tarvitaan paljon 3D ohjelmoinnissa, ja kutsumme niitä matriiseiksi. Taulukot voivat tietysti olla mitä tahansa tyyppiä. Niihin voidaan ladata vaikka olioita, jos se on tarpeen.

 

   1.8 STRING-olio

 

   Kuten jo aiemmin kerroin STRING ei ole muuttuja tyyppi vaan olio. Sen takia ei myöskään saanut loikata alas parvekkeelta. Se että STRING on olio ei tee tätä yhtään vaikeammaksi. Sitä tuskin edes huomaa.

 

STRING olio määritellään aivan kuin muuttujakin.

 

String merkkijono = ”Moikka”;

 

Tuollainen esitys tapa ei kelpaa muille oliolle, mutta STRING on säännön vahvistava poikkeus (hyvä niin). STRING oliolla on ominaisuuksia joita alamme heti miten käymään läpi.

 

Merkkijonoja voidaan yhdistellä + operaattorilla, tähän tapaan.

 

String merkkijono = ”Terve ”+toinen_mjono;

 

Toinen_mjono voisi olla vaikka int tyyppiä ja se ei aiheuttaisi ongelmaa, koska STRING muuttaa int tai jonkin muun tyypin automaattisesti STRING yhteensopivaksi. Tästä toimenpiteestä vastaa toString() metodi. STRING oliolla on muitakin ominaisuuksia.

 

IndexOf(String)

IndexOf(Char)

Hakee merkkijonosta halutun merkin.

lastIndexOf(String)

lastIndexOf(Char)

Hakee merkkijonosta halutun merkin aloittaen haun lopusta.

toUpperCase()

Muuntaa merkkijonon kirjaimet isoiksi.

toLowerCase()

Muuntaa merkkijonon kirjaimet pieniksi.

toString

Muuttaa tyypin merkkijonoksi.

compareTo(String)

Vertaa kahta merkkijonoa.

equals(String)

Ovatko merkkijonot samoja.