Java IDE ja ensimmäinen ohjelma¶
Java on oliopohjainen ohjelmointikieli. Syntaksiltaan se muistuttaa pitkälti C++aa.
Kuten edellä todettiin, nykyään ohjelmoinnissa pääosin käytetään ohjelmointiympäristöjä niiden monipuolisuuden ja sisältämien aputoimintojen vuoksi. Ohjelmoija on usein varsin vapaa valitsemaan itse omat ohjelmointityökalunsa, joten ohjelmointiympäristö on kokeneille koodareille usein mieltymys- ja tottumiskysymys.
Kurssin esimerkkiympäristönä käytämme NetBeansia. NetBeans on saatavilla kaikille käyttöjärjestelmille avoimen lähdekoodin lisenssillä (Apache 2.0). NetBeansin asennuspaketit löydät täältä.
Aloitetaan!¶
Ensimmäisenä ohjelmana tehdään ensimmäisten ohjelmien Kerninghamin ja
Richien tunnetuksi tekemä klassikko eli ns Hei maailma -ohjelma -
Hello World!
. (Huom! Kurssin esimerkit ovat pääsääntöisesti
englanniksi, koska kurssista on käynnissä kaksi kieliversiota. Oman
koodisi voi kirjoittaa myös suomeksi, kunhan kielivalinta on
johdonmukainen.) Hello Worldin etuna on se, että sen avulla on helppo
tutustua sekä ohjelmointikielen syntaksiin että ohjelmointiympäristön
peruskäyttöön. Lisäksi se tarjoaa mahdollisuuden testata, että
ohjelmointiympäristö on oikein asennettu ja toimiva.
Ohjelman kirjoittamiseksi tarvitaan tässä kohtaa vain yksi kooditiedosto eli aloitamme sillä, että NetBeans toimii koodieditorina. Avaa siis NetBeans. Uusi tiedosto syntyy joko uusi tiedosto (New file) -kuvaketta painamalla tai valitsemalla valikosta File->New File.
Tämän jälkeen valitse Other->Java File->Next. Nimeä tiedosto ja valitse sille sopiva kansio. Java-lähdekooditiedosto
on hyvä nimetä aina sen päätason luokan (tai rajapinnan) mukaan. Esimerkiksi jos päätason luokka on nimeltään
TheBestClassEver
, kooditiedoston nimeksi tulee TheBestClassEver.java
. Ole tarkkana pienten ja suurten kirjainten kanssa. theBestClassEver.java
ei käy, koska ensimmäinen kirjan on pieni eikä iso.
Kurssin ohjelmakoodeille kannattaa päättää jokin koottu kansio niin ne löytyvät siististi yhdestä paikasta. Projektia ei tarvitse määritellä. Lopuksi Finish luo tiedoston ja siihen kätevästi valmiin pohjan.
Koodipohjana syntyy seuraava:
/* * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Other/File.java to edit this template */ /** * * @author Terhi */ public class HelloWorld { /** * @param args the command line arguments */ public static void main(String args[]) { // TODO code application logic here } }
Suositus: String args[]
→ String[] args
Netbeansin valmiiksi luomassa koodipohjassa main
-funktion parametri on ilmaistu C-kielestä periytyvässä
muodossa String args[]
. Javassa kuitenkin on vallitseva käytäntö, että taulukon hakasulut
merkitään tyypin eikä nimen perään, ja oikeaoppisempi muoto olisi String[] args
. Koodiesimerkeissä
käytetään tätä jälkimmäistä käytäntöä. Noudata myös itse samaa tapaa!
Javan alkeet¶
Javan koodikommenttilohkot ovat samanlaisia kuin C++:ssakin eli tutut // kommenttirivi
ovat rivikommentteja eli //
:sta rivin loppuun.
/* */
jättävät sisäänsä lohkokommentin. Lohkokommentit eivät voi olla sisäkkäisiä ja rivien edessä olevat asteriskit ovat luettavuutta parantamassa.
/**
alkava lohkokomentti on myöhemmin opittava Javadoc-kommenttilohko. Javadocilla on mahdollista luoda suoraan koodista rajapintadokumentaatio.
Itse ohjelma kirjoitetaan luokan sisään. Jokaisessa Java-ohjelmassa on aina vähintään yksi luokka. Luokka esitellään avainsanalla class
jota seuraa luokan nimi (HelloWorld
). Lisäksi alussa on näkyvyysmääre, yleisimmin public
. Luokan otsikkoa seuraa luokan runko {}
, jonka sisälle itse luokan toteutus kirjoitetaan.
Java-luokan perusrakenne on siis:
public class Name {
<jäsenmuuttujat, joskus kutsutaan myös attribuuteiksi>
<jäsenfunktiot eli metodit>
}
Jokaisessa Java-ohjelmassa on oltava metodi nimeltä main
eli pääohjelma. Se on aina muotoa public static void main(String[] args)
. Pureudutaan lyhyesti loitsun osiin:
public
näkyvyysmääre, joka määrittelee kuka ja mistä metodia voidaan kutsua. Pääohjelman ollessa julkinen Java pystyy käynnistämään ohjelman.static
määrittelee jäsenfunktion luokkafunktioksi ja tarvitaan, jotta pääohjelma voidaan käynnistää luomatta luokasta oliota.void
metodin paluuarvo. Pääohjelma ei palauta mitään eli paluuarvo onvoid
.main
metodin nimi. Tätä metodia ei kutsuta ohjelmasta käsin vaan Java käynnistää pääohjelman itse.String[] args
ohjelman komentoriviltä saamat parametrit eli taulukollinen merkkijonoja. Palataan tähän tarkemmin hiukan myöhemmin.
Kirjoitetaan sitten toiminnallisuus ohjelmalle. Haluamme tulostaa ruudulle ohjelmasta tekstin “Hello World!”. Kirjoitetaan siis pääohjelmalle toiminnallisuutta funktiolohkon sisään.
Tulostamista varten tarvitaan Javan pakkauksesta java.lang
tarkoitukseen sopiva luokka. Tällainen on System
. Java.lang. määrittelee kielen tarpeisiin joukon perusluokkia (esim. System
, String
ja Double
) ja se on mukana ohjelmissa automaattisesti. Pakkauksiin palaamme tarkemmin myöhemmin.
Kirjoita nyt System.out
mainisi sisään. Huomaat, että NetBeans auttaa oikean metodin valinnassa.
Valitse NetBeansin ehdotuksista merkkijonon tulostamiseen sopiva metodi ja laita se tulostamaan haluttu teksti. Merkkijonoliteraalit ovat Javassa syntaksiltaan samanlaisia kuin C++:ssa eli "tämä on merkkijonoliteraali"
.
Kun olet lisännyt koodisi main
-funktioon oikean metodikutsun eli System.out.println("Hello World!")
, voimme kääntää ja ajaa ohjelman. NetBeansissa yksittäisen tiedoston saa ajettua valitsemalla Run->Run File. On kuitenkin tärkeää osata kääntää ja ajaa ohjelmia komentoriviltä (Terminal tai Console Linuxissa, Terminal macOS:ssä ja Command Prompt tai PowerShell Windowsissa).
Mene komentorivillä kansioon, johon asetit NetBeansin tallentamaan koodisi. Java-kielisen ohjelman ajaminen koostuu kahdesta vaiheesta. Ensin lähdekoodi käännetään tavukoodiksi (bytecode). Tämän jälkeen tavukoodi suoritetaan tulkin avustuksella Javan virtuaalikoneessa (Java Virtual Machine eli JVM).
JVM mahdollistaa Javan siirrettävyyden eri alustoille eli sama tavukoodi on suoritettavissa missä tahansa, kunhan JVM on saatavilla. Tutustutaan JVM:iin vähän syvällisemmin myöhemmin.
Komento javac tiedosto.java
esim. javac HelloWorld.java
kääntää lähdekoodin tavukoodiksi. Onnistuneen käännöksen tuloksena kansioon syntyy tavukooditiedosto tiedosto.class
esim. HelloWorld.class
.
Tavukoodi annetaan tulkattavaksi antamalla tulkille luokan nimi komennolla java tiedosto
esim. java HelloWorld
.
Valmistautuminen ensimmäiseen palautettavaan ohjelmointitehtävään¶
Ensimmäisessä Plussaan palautettavassa ohjelmointitehtävässä sinun tulee toteuttaa ohjelma, joka tulostaa ruudulle ohjelman käynnistäessä saamien komentoriviparametrien esittämien lukujen keskiarvon. Tässä esitellään lyhyesti vielä muutamia Javan perusasioita, joita tehtävän ratkaisu vaatii.
Ohjelma (eli sen main
-funktio) saa komentoriviparametrit taulukollisena merkkijonoja String[] args
, joka käyttäytyy main
-funktion sisällä kuin mikä tahansa taulukko. Taulukon läpikäyntiä varten tarvitaan silmukka. Voit valita while
-silmukan ja for
-silmukan välillä, mutta vinkkinä jälkimmäisellä pystyy oikomaan paljon itse parametrien käsittelyn osalta. Syntaksiltaan for
-silmukan perusmuoto muistuttaa C++:aa.
for (alustus; lopetusehto; askel) {
silmukan runko
}
Silmukasta löytyy kuitenkin myös muoto, joka on tarkoitettu esimerkiksi taulukoiden ja säiliö-tietorakenteiden läpikäyntiin.
for (alkio : säiliö) {
silmukan runko
}
Esimerkki tällaisesta silmukasta, joka tulostaisi komentoriviparametrit ruudulle:
for (String s : args) {
System.out.println(s);
}
Jos haluat käydä taulukon läpi perinteisellä for
-silmukalla indeksi kerrallaan, täytyy tietää taulukon koko.
Tässä auttaa tieto, että Javan taulukoilla on taulukon koon kertova jäsen length
, johon voi viitata
Pythonista ja C++:sta tutulla pistenotaatiolla. Myös taulukon tietyn indeksin alkioon viitataan Javassa tuttuun tapaan “indeksi hakasuluissa”-notaatiolla. Alla on esimerkkinä silmukka, joka tulostaa komentoriviparametrit indeksien kera ruudulle. Huomaa, kuinka Javassa voi liittää tulostettavia osia yhteen +
-operaattorilla samaan tapaan kuin esim.
Pythonissa.
for (int i = 0; i < args.length; i++) {
System.out.println(i + ": " + args[i]); // Tulostus muotoa "indeksi: parametri".
}
Jos s
on String
-merkkijono, joka esittää lukua, voi sen muuntaa double
-arvoksi kutsulla Double.parseDouble(s)
. Siis esimerkiksi:
String s = "3.14";
double d = Double.parseDouble(s); // double-muuttuja d saa arvon 3.14.
Keskiarvo-tehtävän pitäisi olla edellisten esimerkkien pohjalta varsin suoraviivainen.