Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Hei, Java!

osaamistavoitteet

  • Tutustut Java-kielen perusteisiin
  • Tiedät, miten Java-ohjelma käännetään ja ajetaan
  • Tiedät, mikä on (J)VM ja miten kääntäminen eroaa tulkkauksesta
  • Tunnet Java-kielen vastineita yleisimmille I/O-operaatioille

Ohjelmointi 2 -kurssilla käytämme Java-ohjelmointikieltä. Java on yleiskäyttöinen olio-ohjelmointia tukeva kieli, joka on tarkoitettu alustasta riippumattomien ohjelmien kirjoittamiseen. Java on suosittujen ohjelmointikielten kärkilistoilla (ks. esim. TIOBE index, StackOverflow 2025 developer survey, suosituimmat kielet GitHub-palvelussa). Javan syntaksi muistuttaa paljon Ohjelmointi 1 -kurssilla käytettyä C#-kieltä.

Java-kielen perusteet

Lähdetään liikkeelle perinteisellä 'Hei, maailma' -esimerkillä Javalla:

/* 1 */ void main() {
/* 2 */     IO.println("Hei, maailma!");
/* 3 */ }

Käydään läpi ohjelma rivi riviltä:

  1. Java-ohjelman suoritus alkaa main-nimisestä aliohjelmasta. void tarkoittaa, että aliohjelma ei palauta mitään arvoja. Koska pääohjelma ei ota parametreja, main-sanan perässä olevat kaarisulkeet voidaan jättää tyhjäksi. Aliohjelman runko alkaa avaavalla aaltosululla {.

  2. Tekstin tulostaminen komentorivi-ikkunaan onnistuu IO.println-metodilla. Javassa lause loppuu yleensä puolipisteeseen ;, kuten tässäkin.

  3. Aliohjelman runko lopetetaan aaltosululla }. Ohjelman suoritus päättyy automaattisesti, kun main-aliohjelma on suoritettu loppuun.

Vaikka ohjelma on hyvin yksinkertainen, se on silti aivan toimiva Java-ohjelma. Opintojakson aikana teemme paljon juuri komentorivi-ikkunaan kirjoittavia ja sieltä lukevia ohjelmia. Opintojakson loppupuoliskolla painopiste siirtyy graafisten käyttöliittymien parissa työskentelyyn.

Javan koodauskäytänteistä

Monesti ohjelmointikielessä on joukko kyseiseen kieleen vakiintuneita koodauskäytänteitä. Näin on myös Javassa. Tutustumme erilaisiin käytänteisiin tämän materiaalin edetessä. Mainittakoon, että Javan koodauskäytänteet poikkeavat hieman C#-kielen käytänteistä muun muassa nimeämisessä ja koodin muotoilussa.

Tässä olennaisimmat Javan koodauskäytänteet, joita on tässä vaiheessa hyvä pitää mielessä:

  • Aliohjelman runkoa aloittava aaltosulku { laitetaan yleensä samalle riville kuin aliohjelman määrittely. Sama pätee muihin rakenteisiin, joissa käytetään aaltosulkuja, kuten if-, for-, while- ja do-while-rakenteille.

  • Muuttujien ja aliohjelmien nimeämisessä käytetään camelCasing-tyyliä, eli ensimmäinen kirjain on pienaakkonen ja seuraavat sanat aloitetaan suuraakkosella. Esimerkiksi tamaOnFunktionNimi.

  • Tiedostojen ja luokkien nimeämisessä käytetään PascalCasing-tyyliä, eli ensimmäinen kirjain on suuraakkonen ja seuraavat sanat aloitetaan isolla kirjaimella: HeiMaailma.java, public class Opiskelija, jne. Samoin monissa muissa myöhemmin opittavissa rakenteissa, kuten rajapinnoissa ja enumeraatioissa käytetään PascalCasing-tyyliä.

Opas: Java-ohjelmien kääntäminen ja ajaminen

tärkeää

Tässä osiossa tarvitset opintojakson työkaluja. Käy ensin asentamassa kaikki työkalut Työkaluohjeesta.

Vaikka monet yllä olevan tapaiset pienet ohjelmat voidaan periaatteessa tehdä nettiselaimessa, on ohjelmia kehittäessä varsin käytännöllistä käyttää erillistä kehitysympäristöä. Tässä materiaalissa käytämme IntelliJ IDEA -kehitysympäristöä Java-ohjelmien luomiseen, ajamiseen ja virheenjäljitykseen.

Luo uusi projekti

Luodaan seuraavaksi yksinkertainen projekti IDEAssa. Projekti on IDEA-kehitysympäristön tapa koostaa lähdekooditiedostoja, testejä, kirjastoja ja muita lisätiedostoja yhteen kokonaisuuteen.

Tee seuraavasti:

  1. Avaa IntelliJ IDEA ja avaa uuden projektin dialogi.

    Jos sinulle avautui Welcome to IntelliJ IDEA, valitse New Project.

    Jos sinulle avautui jokin valmis Java-projekti, valitse yläpalkissa File New Project.

    Yläpalkin valinnat saattavat olla hampurilaisvalikkopainikkeen () takana.

  2. Uuden projektin dialogissa aseta seuraavat tiedot:

    • Valitse vasemmalla puolella olevasta listasta projektityypiksi Empty Project.

    • Aseta projektin nimeksi Name-kenttään HelloWorld. Projektien nimet kirjoitetaan yleensä ilman välilyöntejä.

    • Aseta projektin sijainti Location-kenttään. Klikkaa kentän oikealla puolella olevaa kansiokuvaketta () ja valitse projektille sopiva kansio. Valitse sellainen kansio, jonka löydät tulevaisuudessakin helposti omalta tietokoneelta.

    • Laita ruksi Create Git repository pois päältä. Emme tarvitse versiohallintaa vielä tässä vaiheessa.

    Yllä olevien valintojen jälkeen tuloksen pitäisi näyttää seuraavalta (Location-kenttä voi olla erilainen riippuen käyttöjärjestelmästäsi):

  3. Paina Create. Tämän jälkeen IDEA luo uuden projektin valitsemaasi kansioon.

    Käydään pikaisesti läpi IDEAn olennaisimmat osat:

    1. Koodialue: projektissa olevien tiedostojen sisällöt näkyvät tässä, kun ne avataan. Kukin avattu tiedosto avautuu omaan välilehteen.
    2. Projektiselain: projektissa olevat kansiot ja tiedostot näkyvät tässä. Selaimen kautta voidaan lisätä, poistaa, siirtää tai uudelleennimetä tiedostoja ja kansioita.
    3. Projektin ajaminen ja debuggaus: tässä näkyy ajettavan Java-ohjelman nimi, ohjelman ajopainike () ja debuggauspainike ().
    4. Valikot ja näkymät: IDEAssa on erilaisia näkymiä, jotka ovat oletuksella piilossa. Sivupalkin avulla voidaan avata ja piilottaa näkymät tarpeen mukaan. Esimerkiksi projektiselaimen voi piilottaa painamalla sivupalkissa olevasta kansiokuvakkeesta ().

Luo Java-moduuli

Oletuksella uusi projekti on tyhjä. IDEA:ssa ohjelmakoodi kirjoitetaan moduuleihin (engl. module). Samaan projektiin voi lisätä useita moduuleita, joita voi kehittää ja ajaa erikseen. Esimerkiksi, voit näin tehdä yhden projektin tietyn viikon tehtäville (esim. Viikko1 tai Viikon1Tehtavat) ja lisätä kunkin tehtävän omana moduulina.

Luodaan seuraavaksi alimoduuli nimeltään HelloProgram, lisätään siihen uusi ohjelma ja kokeillaan ajaa se.

Tee seuraavasti:

  1. Klikkaa hiiren toissijaisella painikkeella projektin nimeä projektinäkymässä (HelloWorld) ja valitse New Module.

  2. Avautuvassa New Module -dialogissa aseta seuraavat tiedot:

    • Valitse vasemmalla puolella olevasta listasta projektityypiksi Java.

    • Aseta projektin nimeksi Name-kenttään HelloProgram. Projektien nimet kirjoitetaan yleensä ilman välilyöntejä.

    • Jätä Location-kenttä sellaisenaan. IDEA automaattisesti valitsee moduulille oikean sijainnin.

    • Valitse Build system-rivillä IntelliJ. Tutustumme muihin projektien rakennusjärjestelmiin myöhemmissä osissa.

    • Varmista, että JDK-kentässä on sama JDK-versio kuin minkä olet asentanut Työkaluohjeissa.

    • Laita ruksi Add sample code pois päältä. Lisäämme kooditiedoston itse.

    Yllä olevien valintojen jälkeen tuloksen pitäisi näyttää seuraavalta (Location-kenttä voi olla erilainen riippuen käyttöjärjestelmästäsi):

    Paina lopuksi Create. Tämä luo uuden HelloProgram-kansion, joka sisältää src-kansion.

Luo lähdekooditiedosto

IntelliJ-projektissa moduuliin kuuluva koodi laitetaan src-kansioon. Jos projektissa on useampi moduuli, jokaisella moduulilla on oma src-kansio.

Luodaan seuraavaksi yksinkertainen Java-lähdekooditiedosto, johon voidaan kirjoittaa koodi.

  1. Klikkaa projektiselaimessa olevaa HelloProgram-moduulin alasvetopainiketta. Sen jälkeen klikkaa toissijaisella hiiren painikkeella src-kansiosta ja valitse New Java Compact File.

  2. Anna lähdekooditiedoston nimeksi Ohjelma ja paina Enter.

IDEA luo uuden Ohjelma.java-nimisen tiedoston src-kansioon. IDEA myös lisää automaattisesti main-aliohjelman määrittelyn lähdekooditiedostoon. Samalla IDEA avaa lähdekooditiedoston koodialueelle. Voit jatkossa avata tiedoston myös tuplaklikkaamalla sitä.

Kirjoita ohjelma

Kirjoitetaan seuraavaksi yksinkertainen "Hei, maailma"-ohjelma alusta alkaen juuri luotuun Ohjelma.java-tiedostoon.

Tee seuraavasti:

  1. Poista kaikki koodi Ohjelma.java-tiedostosta.

    IDEA lisää yleensä valmista pohjakoodia uusiin lähdekooditiedostoihin. Tätä harjoitusta varten kirjoitamme kuitenkin koodia itse.

  2. Kirjoita seuraava koodi Ohjelma.java -tiedostoon:

    void main() {
        IO.println("Hei, maailma!");
    }
    

    Vältä kopioimasta koodia, vaan kirjoita se itse. Kirjoittaminen itse usein auttaa muistamaan, mistä eri ohjelmoinnissa käytettävät merkit, kuten aaltosulut, kaarisulut ja puolipiste löytyvät.

Bonus: IDEAn täydennysominaisuuksien käyttäminen

IDEA tarjoaa erilaisia aikaa säästäviä täydennysominaisuuksia, joiden käyttöä on hyvä harjoitella.

Kokeile ainakin seuraavia ominaisuuksia.

  • main-pääohjelman automaattinen lisääminen: Aloita kirjoittamalla main. Paina sen jälkeen Ctrl+Space (macOS: +Space). Valitse nuolinäppäimillä main-pohja ja paina Enter:

    IDEA sisältää erilaisia valmiita pohjia, jotka nopeuttavat koodin kirjoittamista ja helpottavat yleisempien rakenteiden muistamista. Näet kaikki koodipohjat painamalla Ctrl+J (macOS: +J).

  • println-aliohjelman automaattinen täydentäminen: Siirrä kursori main-pääohjelmaan tyhjälle riville.

Kirjoita alkuun kirjain I, minkä jälkeen IDEA automaattisesti näyttää kaikki kursorin kohdalle sopivat rakenteet, jotka alkavat kirjaimella I. Valitse nuolipainikkeilla IO ja paina Enter. Tämä täydentää IO kursorin kohdalle.

Kirjoita sen jälkeen . (piste), minkä jälkeen IDEA automaattisesti näyttää kaikki IO-luokassa olevat aliohjelmat. Siirry listassa nuolipainikkeilla println-aliohjelman kohdalle ja paina Enter. Tämä täydentää println-tekstin kursorin kohdalle.

Kirjoita sen jälkeen kaarisulku (. IDEA automaattisesti täydentää lopettavan kaarisulun ). Siirry nuolipainikkeilla kaarisulkujen väliin ja kirjoita "Hei, maailma!". Lopuksi siirry rivin loppuun painamalla End tai nuolinäppäimiä käyttäen ja lisää loppuun puolipiste ;.

IDEA osaa automaattisesti siis ehdottaa luokkien ja aliohjelmien nimiä kontekstin perusteella. Voit myös aina erikseen avata automaattisen täydennyksen painamalla

Ohjelman ajaminen

Kooditiedostoja, jotka sisältävät main-aliohjelman, voidaan suorittaa. Suorittaminen onnistuu ajopainikkeella (), joka sijaitsee main-aliohjelman vieressä sekä IDEA:n yläpalkissa.

Tee seuraavasti:

  1. Klikkaa main-aliohjelman vasemmalla puolella olevaa ajopainiketta ().

    IDEA ensin kääntää ohjelmasi. Kun ohjelma on käännetty, IDEA ajaa ohjelmasi, ja editorin alapuolelle avautuu Run-ikkuna, jossa näkyy tekstiä. Ensimmäinen rivi on se komento, jota IDEA käytti käännetyn tiedoston ajamiseksi. Seuraavalla rivillä on oman ohjelmamme tuottama tuloste Hei, maailma!. Viimeinen rivi kertoo, että ohjelman suoritus päättyi ilman virheitä.

  2. Kokeile vielä ohjelman ajamista luodulla ajokonfiguraatiolla.

    Kun ajat kooditiedoston ensimmäistä kertaa, IDEA luo ajokonfiguraation. Ajokonfiguraatio on pieni tiedosto, johon tallentuu koodin suorittamiseen liittyviä asetuksia, kuten käytettävä JDK-versio, mahdolliset komentoriviparametrit ja työhakemisto. Oletusarvoisesti tämä tiedosto syntyy projektin juurikansioon .idea workspace.xml.

    Kun ajokonfiguraatio on luotu ensimmäisen ajon jälkeen, voit jatkossa ajaa koodin aina IDEA:n yläpalkissa olevalla ajopainikkeella. Tällä tavoin voit helposti ajaa ohjelmia ilman, että kooditiedostoa tarvitsee erikseen avata.

    IDEAn yläpalkissa pitäisi nyt näkyä Ohjelma-ajokonfiguraation nimi, jonka vieressä on ajopainike (). Kokeile sulkea Ohjelma.java ja suorittaa ohjelma yläpalkin kautta.

    Ajokonfiguraatioiden avulla voit ajaa eri moduuleissa kirjoitettuja ohjelmia. Myöhemmin materiaalissa tutustumme lisäksi Gradle-hallintatyökaluun, jonka avulla teemme muun muassa erillisiä ajokonfiguraatioita projektin ajamiselle, testaamiselle ja kääntämiselle.

vinkki

Tutustu yleisimpiin pikanäppäinkomentoihin

Näppäinkomennot nopeuttavat kehitysympäristön käyttöä, ja pienellä harjoittelulla ohjelmointi voi sujua kokonaan hiirtä käyttämättä. Näppäinkomennot riippuvat käyttöjärjestelmästä ja valituista näppäinasetuksista. IDEA kuitenkin näyttää näppäinkomennot valikoissa sekä vihjeteksteissä, mikä helpottaa komentojen oppimista.

Voit myös muokata näppäinkomentoja asetuksista kohdassa File Settings Keymap. Voit myös ladata muiden kehitysympäristöjen, kuten Visual Studio Coden, näppäinasetuksia laajennoskaupasta kohdassa File Plugins.

Kääntäminen ja ajaminen komentoriviltä

Ennen kuin IDEA varsinaisesti ajaa ohjelman, se käännetään ajettavaan muotoon. IDEAssa tämä tapahtuu taustalla automaattisesti klikkaamalla ajopainiketta, debuggauspainiketta tai Build-valikon kautta. Java-lähdekoodin voi kuitenkin tarvittaessa myös kääntää ja ajaa itse komentoriviltä. On hyvä tietää, miten tämä tapahtuu, jotta ymmärrät paremmin, mitä IDEA taustalla tekee.

Tutkitaan nyt, miten ohjelma käännetään ja ajetaan komentoriviltä.

Miten voin seurata mukana?

Tee alkuun yksinkertainen ohjelma yllä olevan oppaan mukaisesti.

Sen jälkeen avaa IDEA:n vasemmasta näkymäpalkista komentorivi painamalla komentorivipainikkeesta (). Tämä avaa käyttöjärjestelmän komentorivin (zsh macOS:lla, PowerShell Windowsilla, oletuskomentorivi Linuxilla).

Jos latasit Java-kehitysympäristön seuraamalla työkaluohjeita, komentorivi ei löydä mitään Javan kääntämiseen tarkoitettuja työkaluja. Ota työkalut käyttöön kopioimalla ja liittämällä alla oleva komento:

Valitse käyttöjärjestelmäsi yllä olevista vaihtoehdoista.

Yllä oleva komento mahdollistaa JDK:n työkalujen käyttöä komentoriviltä väliaikaisesti. Komentorivi palautuu ennalleen, kun suljet ja avaat komentorivin uudelleen.

Avataan nyt komentorivi ja siirrytään alkuun projektikansioon. Tarkastellaan vielä, mitä tiedostoja projektista löytyy:

Koska käytössämme on IntelliJ-projekti, sieltä löytyy vain muutama olennainen tiedosto ja kansio:

  • HelloWorld.iml on projektin asetustiedosto, jolla IDEA tunnistaa kansion olevan Java-projekti
  • HelloProgram on lähdekoodikansio, jossa kaikki lähdekooditiedostot sijaitsevat
  • out on kansio, joka sisältää käännetyt ohjelmat

Siirrytään nyt kansioon HelloProgram ja tarkastellaan sen sisältö:

Yksittäisestä moduulista löytyvät vastaavasti seuraavat tiedostot ja kansiot:

  • HelloProgram.iml on moduulin asetustiedosto, jolla IDEA tunnistaa kansion olevan Java-moduuli
  • src on lähdekoodikansio, joka sisältää ohjelman lähdekoodin

Siirrytään vastaavasti kansioon src ja tarkastellaan sen sisältö:

.java-tiedostopäätettä käytettävät tiedostot ovat Javan lähdekooditiedostoja. Ne sisältävät ohjelman lähdekoodia tekstinä eivätkä ne ole vielä suoraan ajettavissa.

Jotta ohjelma voidaan ajaa, se pitää kääntää. Kuten mainitsimme, IDEA tekee tämän automaattisesti kun käynnistämme tekemämme ohjelman, mutta lähdekoodin kääntäminen onnistuu myös komentoriviltä käyttäen Java-kehitysympäristön mukana tullutta javac-kääntäjäohjelmaa. Kokeillaan kääntää Ohjelma.java:

Jos kääntäminen onnistui, javac-komento ei tulosta oletuksena mitään. Tutkitaan vielä kansion rakenne ls-komennolla:

Kääntämisen seurauksena syntyy .class-päätteinen tiedosto. Tämä tiedosto sisältää niin sanottua tavukoodia (engl. bytecode), joka on tiedoston käännetty muoto. Tavukoodi ei ole suoraan prosessorilla ajettava ohjelma, vaan eräänlainen välivaihe. Tavukoodia voidaan kuitenkin suorittaa Javan virtuaalikoneella (JVM, Java Virtual Machine), joka on erillinen ohjelma, joka osaa tulkita ja suorittaa tavukoodia. Vaikka tämä voi kuulostaa turhan monimutkaiselta, hyöty on siinä, että ohjelma joka on käännetty Java-tavukoodiksi voidaan nyt ajaa eri alustoilla (Windows, macOS, Linux, jne.), kunhan JVM on toteutettu kyseisellä alustalla. JVM voi puolestaan optimoida tavukoodia juuri alustalle ja prosessorille sopivaan muotoon. Javalla onkin iskulause: "Write Once, Run Anywhere", jolla viitataan tähän periaatteeseen.

JDK:n kanssa tulee myös valmiiksi Java-virtuaalikone sekä Javan ajoympäristö (JRE, Java Runtime Environment), joka sisältää yleisempiä toimintoja, joita Java-ohjelma saattaa käyttää. Tavukooditiedosto voidaan ajaa JVM:llä käyttäen java-komentoa:

Huomaa, että java-komentoa antaessa kirjoitetaan tavukooditiedoston nimi ilman .class-päätettä. Myöhemmin materiaalissa tutustumme Gradle-projektinhallintaohjelmaan, jolla pystyy kääntämään useita lähdekooditiedostoja yhteen .jar-tiedostoon, johon voidaan pakata kaikki ohjelman ajamiseen tarvittavat tiedostot. Myös .jar-tiedostot voidaan suorittaa java-komennolla.

vinkki

Alkaen Javan versiosta 11 java-komento osaa myös automaattisesti kääntää ja suorittaa .java-lähdekooditiedostot ilman erillistä javac-kääntäjän ajamista.

Lisäksi tässä materiaalissa käytämme pääosin IDEA-kehitysympäristöä, joka hoitaa lähdekooditiedostojen kääntämisen automaattisesti ja tehokkaasti.

Bonus: jshell-tulkkiohjelma

Vaikka Java lasketaan käännettäväksi kieleksi, toisinaan voi olla hyödyllistä kokeilla Java-ohjelmien kirjoittamista interaktiivisesti ilman jatkuvaa kääntämistä. Interaktiivisuus tässä tarkoittaa, että voit kokeilla eri komentoja rivi/lohko kerrallaan ilman erillistä kääntämistä ja ajamista, luokkia tai main-pääohjelmaa.

Tätä varten JDK sisältää jshell-ohjelman, joka on Java-ohjelman komentorivitulkki eli ns. REPL-tulkki (read-evaluate-print-loop).

jshell tarjoaa useita hyödyllisiä toimintoja, kuten:

  • Luokkien ja aliohjelmien nimien täydennys ja haku Tab-painikkeella
  • Lausekkeiden suorittaminen ilman tarvetta main-aliohjelmalle

jshell-ohjelmasta voi poistua /exit-komennolla.

Tekstin tulostaminen ja syötteen lukeminen komentorivi-ikkunassa

Jatkossa voi olla hyödyllistä tulostaa erilaisia asioita komentorivin avulla ja toisaalta lukea tietoa sieltä. Javan IO-luokka tarjoaa kolme perustoimintoa tekstin tulostamiseen ja lukemiseen komentorivillä:

AliohjelmaEsimerkkiSelitys
printlnIO.println("Moi!"); Tulostaa parametrina annetun arvon ja lisää loppuun rivinvaihdon
IO.println(); Tulostaa rivin rivinvaihdolla
printIO.print("Samalla rivillä!"); Tulostaa parametrina annetun arvon ilman rivinvaihtoa
readlnIO.readln(); Lukee syöterivin käyttäjältä (ts. Enterin painallukseen saakka). Jos käyttäjä lopettaa ohjelman antamatta syötettä, palauttaa ns. null-viitteen
IO.readln("Anna sana > "); Sama kuin readln, mutta tulostaa ensin annetun tekstin ennen syötteen lukemista.

Katsotaan vielä näiden yhteistoimintaa. Voit muokata alla olevaa esimerkkiä vapaasti ja kokeilla, miten erilainen tulostus toimii.

void main() {
    String nimi = IO.readln("Anna nimesi: > ");
    IO.println();
    IO.println("Moi, " + nimi + "!");

    IO.print("Tämä teksti");
    IO.print(" menee samalle");
    IO.print(" riville");
    
    IO.println(); // Kokeile ottaa tämä pois ja katso, mitä tapahtuu

    IO.println("Tervetuloa Ohjelmointi 2 -kurssille!");
}