Kaikki ennen Syyskuuta 2023 julkaistut java-tutoriaalit ovat kertaheitolla vanhentuneita. Ne ovat edelleen yhtä hyviä kuin aiemminkin, mutta javan versiossa 21 lisättiin eräs merkittävä ominaisuus: Nimeämättömät luokat ja instanssi-mainmetodit. Käännös on hieman kömpelö, mutta alkuperäinen ja teknisempi selostus on julkaistu täällä: JEP 445: Unnamed Classes and Instance Main Methods (Preview).
Javan opettaminen ennen syyskuuta 2023
Javaa voi toki opettaa monella tavalla, esimerkiksi tutustumalla vain yksittäisiin lauseisiin ja lausekkeisiin, mutta usein aloitetaan kokonaisesta kokonaisesta ohjelmasta, jonka voi kääntää ja suorittaa.
Näin ollen opiskelijan eteen tuutataan seuraava ohjelma:
public class Esimerkki{
public static void main(String[] args){
}
}
Kuinkaan tässä ei vielä ole yhtään mitään suoritettavaa. Tyypillisesti esimerkissä on tämän lisäksi ehkä jokin tulostus, mutta jo pelkästään “tyhjässä” koodissa on melkoisen paljon selitettävää:
- Mikä on
public
? - Mikä on
class
? - Mikä on
Esimerkki
? - Mikä on
static
? - Mikä on
void
? - Mikä on
main
? - Mikä on
String
? - Mikä on
[]
? - Mikä on
args
? - Mikä on
(
ja)
? - Mikä on
{
ja}
ja miksi niitä on noin paljon?
No, öö. En nyt oikeen ehdi selittää, mitä 1, 2, 4, 8 ja 9 ovat. Katsotaan kuitenkin pian mikä on 7. Ja öö no 3 on tavallaan ohjelman nimi, tai ainakin toistaiseksi voidaan ajatella näin. No oikeastaan 5 on myös vähän hankala selittää tässä vaiheessa. No 6 on main- eli pääohjelma. Eli sen jälkeen {
ja }
merkkien väliin aletaan kirjoittaa varsinaista ohjelmaa ja… jne.
Siis kaiken voi kyllä selittää, mutta..
Opettaja on tässä vaiheessa päätöksen edessä. Pitäisikö selittää kaikki listatut 11 asiaa? Tämä on käsitykseni mukaan noin kolmen luennon verran asiaa, eikä aloittelija ehdi omaksua kaikkea kerralla.
Toinen vaihtoehto on antaa äärimmäisen pintapuolinen selitys kaikesta, mikä ei välttämättä myöskään palvele tarkoitusta. Mahdollisesti jotkut asiat voi myös ohittaa kokonaan: “tietokone nyt vaan tarvitsee kaikenlaisia ohjeita siihen ohjelman ympärille, jotta sitä voi alkaa suorittaa..”. Tämä johtaa pahimmillaan siihen, että opiskelija asennoituu niin, että koodissa on paljon asioita, joita ei tarvitsekaan tietää.
Pitää siis valita informaatiotulvan ja asioiden ohittamisen välillä.
Java 21 muuttaa asioita merkittävästi.
Javan perusteet: versio 21
Tervetuloa opiskelemaan Java-ohjelmointikieltä. Olemme nyt (leikisti) saaneet tarvittavat työkalut asennettua, eli voimme tarkastella ensimmäistä java-ohjelmaamme:
void main(){
}
Esimerkissä nähdään yksinkertaisin mahdollinen java-ohjelma. Se on niin yksinkertainen, ettei se vielä tee mitään, mutta sen voisi kääntää ja suorittaa. Tallenna koodi mihin tahansa .java
tiedostoon, kuten Esimerkki.java
ja suorita se komennolla java Esimerkki
. Ohjelma ei tee mitään, mutta jos et saanut virheilmoitusta, kaikki on kunnossa ja voimme jatkaa eteenpäin.
Koodi koostuu neljästä osasta: void
, main
, ()
ja {}
.
Tämä koodiesimerkki on main
- eli pääohjelman määrittely. Kyseessä on java-kieleen rakennettu ominaisuus, jonka mukaan ohjelman suoritus alkaa aina pääohjelmasta. Tämä on siis ohjelman nimi ja sen pitää olla main
, eikä esim. Main
tai pää
. Sanan main
perässä on kaarisulkeet ()
joita käytetään tässä korostamaan sitä, että kyseessä on nimenomaan ohjelmakoodin osa, joka voidaan suorittaa. Jos heti alkuun herää tuttu kysymys “miksi niiden pitää olla juuri nuo sulkeet ja miksei se toimi ilman”, niin täytyy muistaa että ohjelmointikielet ovat ihmisten keksimiä. Niissä on valittu tietyt rakenteet tarkoittamaan tiettyjä asioita.
Varsinaiset suoritettavat koodirivit kirjoitetaan määrittelyn perään kirjoitetun ohjelmalohkon sisälle, eli {}
-merkkien väliin.
Otetaan pian ensimmäinen esimerkki, jossa ohjelma tekeekin jotain, mutta kuten huomaatte, alusta “unohtui” selittää mitä void
tarkoittaa. Tämä on hieman hankalampi selittää tässä kohtaa, sillä varsinaisten funktioiden käsitteen opettelemme myöhemmin. Jos yksinkertaistamme asiaa, void
määrittää tässä, että main
on eräänlainen proseduuri. Se on siis ohjelmakoodin pätkä, jonka voi suorittaa, mutta sillä ei ole varsinaista lopputulosta: Lopputulos on siis void
eli tyhjä. Vertailuksi voisimme ehkä laskea jotakin, jolloin lopputuloksena olisi luku. Tutustutaan ensin kuitenkin yksinkertaisiin koodiesimerkkeihin.
Tämä esimerkki päättyy tähän, mutta koko selitys mahtui suunnilleen yhdelle näytölle. Selitykset eivät välttämättä avanneet ihan kaikkea, mutta erityisesti alkeisopetuksessa on tärkeää kertoa vain se mitä tarvitsee. Kaikenlainen höpinä funktioista, metodeista, kutsuista, parametreista ja paluuarvoista voidaan jättää seuraaville kerroille, tai oppitunnin myöhempään osaan.
Lopuksi
Joka tapauksessa java on työläämpi kieli selittää hyvin. Siinä missä python-ohjelman voi kirjoittaa näin:
a = 5
b = 6
print(a+b)
jolloin voi aloittaa lyhyesti muuttujista ja siitä miten print saa asioita näkymään näytöllä, mutta javassa sama esimerkki olisi kuten tässä:
void main(){
int a = 5;
int b = 6;
System.out.print(a+b);
}
Yhtäläisyydet ovat toki selvästi nähtävissä, joskin println
metodin käyttö lienee yleisempää ja toisaalta lähempänä pythonin totetusta, koska pythonin print
tulostaa myös rivinvaihdon.
Javassa joutuu kuitenkin sitten selittämään tietotyypeistä ja toisaalta piste-notaatiokin pitää ottaa heti alkuun. Tässä tunnustan myös oikaisevani: Systemoutprintln nyt vain sattuu olemaan se tapa, jolla javassa saa asioita näkymään näytölle. Ehkä juuri ja juuri lisämateriaalissa saa ohimennen selitettyä, että System on kokoelma pieniä koodinpätkiä, joilla ohjelmamme voi olla yhteydessä tietokoneen käyttöjärjestelmään ja lisäksi voi mainita mikä järjestelmän outputstream eli oletustulostusvirta on.
Opetan kyllä silti mielelläni javaa, myös ensimmäisenä kielenä. Erityisesti on kiinnostavaa päästä opettamaan javan uusinta versiota ja vertailla oppimistuloksia aiempiin versioihin nähden.