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ä:
-
Java-ohjelman suoritus alkaa
main-nimisestä aliohjelmasta.voidtarkoittaa, 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{. -
Tekstin tulostaminen komentorivi-ikkunaan onnistuu
IO.println-metodilla. Javassa lause loppuu yleensä puolipisteeseen;, kuten tässäkin. -
Aliohjelman runko lopetetaan aaltosululla
}. Ohjelman suoritus päättyy automaattisesti, kunmain-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, kutenif-,for-,while- jado-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:
-
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.
-
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):
-
-
Paina Create. Tämän jälkeen IDEA luo uuden projektin valitsemaasi kansioon.
Käydään pikaisesti läpi IDEAn olennaisimmat osat:
- Koodialue: projektissa olevien tiedostojen sisällöt näkyvät tässä, kun ne avataan. Kukin avattu tiedosto avautuu omaan välilehteen.
- Projektiselain: projektissa olevat kansiot ja tiedostot näkyvät tässä. Selaimen kautta voidaan lisätä, poistaa, siirtää tai uudelleennimetä tiedostoja ja kansioita.
- Projektin ajaminen ja debuggaus: tässä näkyy ajettavan Java-ohjelman nimi, ohjelman ajopainike () ja debuggauspainike ().
- 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:
-
Klikkaa hiiren toissijaisella painikkeella projektin nimeä projektinäkymässä (
HelloWorld) ja valitse New Module. -
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.
-
Klikkaa projektiselaimessa olevaa
HelloProgram-moduulin alasvetopainiketta. Sen jälkeen klikkaa toissijaisella hiiren painikkeellasrc-kansiosta ja valitse New Java Compact File. -
Anna lähdekooditiedoston nimeksi
Ohjelmaja 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:
-
Poista kaikki koodi
Ohjelma.java-tiedostosta.IDEA lisää yleensä valmista pohjakoodia uusiin lähdekooditiedostoihin. Tätä harjoitusta varten kirjoitamme kuitenkin koodia itse.
-
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 kirjoittamallamain. 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ä kursorimain-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:
-
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ä. -
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
.ideaworkspace.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 sulkeaOhjelma.javaja 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:
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.imlon projektin asetustiedosto, jolla IDEA tunnistaa kansion olevan Java-projektiHelloProgramon lähdekoodikansio, jossa kaikki lähdekooditiedostot sijaitsevatouton 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.imlon moduulin asetustiedosto, jolla IDEA tunnistaa kansion olevan Java-moduulisrcon 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ä:
| Aliohjelma | Esimerkki | Selitys |
|---|---|---|
println | IO.println("Moi!");
| Tulostaa parametrina annetun arvon ja lisää loppuun rivinvaihdon |
IO.println();
| Tulostaa rivin rivinvaihdolla | |
print | IO.print("Samalla rivillä!");
| Tulostaa parametrina annetun arvon ilman rivinvaihtoa |
readln | IO.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!");
}