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.

NetBeans-kuvake

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.

pic1 tai pic2

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.

pic3 pic4

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 -video (kesto 44:26).

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 on void.

  • 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.

NetBeansin jäsenfunktiolistaus

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.

Komentorivi, jossa ajettu javac ja java

Syntaksivirheet:

Kokeile, mitä tapahtuu, kun kirjoitat NetBeansissa virheelliset koodirivit System.out.printl("One); ja System.out.printl("One) koodiisi. Miten NetBeans huomauttaa virheistäsi?

Ohjelman suorittaminen NetBeansissa:

Yksi kooditiedosto voidaan ajaa NetBeansissa valitsemalla Run->Run file. Missä NetBeans näyttää ohjelman suorituksen tai mahdolliset virheet?

Ohjelman kääntäminen ja suorittaminen komentoriviltä:

Koodi käännetään ja ajetaan komentoriviltä

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.