Varmistetaan, että kaikilla toimii:
Konffataan editoria:
Eclipse "Perusasetukset kuntoon Eclipsestä. Katso luku 3
Eclipsehierarkia: workspace > (Java) project > Package > Class
Kirjastojen lisääminen: Oman tai jonkun muun tekemän .jar- tiedoston (esimerkiksi kurssilla käytettävä Graphics.jar ) voi lisätä Eclipseen seuraavasti. Valitse ylävalikosta Project → Properties → Java Build Path. Tämän jälkeen paina oikealta Add External Jars ja hae tiedostoistasi tallentamasi .jar-päätteinen tiedosto.
Syntaksivirheet: Eclipse huomaa osan syntaksivirheistä, joten osa virheistä voidaan korjata jo ennen kääntämistä. Kun Eclipse löytää virheen, ilmestyy virheellisen rivin kohdalle vasemmalle marginaaleihin punainen rasti. Lisäksi jos virhe paikallistuu alleviivaa Eclipse virheellisen koodinpätkän punaisella aaltoviivalla. Viemällä hiiri punaisen rastin päälle, Eclipse kertoo tarkemmin mikä kyseisessä kohdassa on vikana. Huomaa, että Eclipse ei välttämättä paikallista virhettä täysin oikein. Usein virhe voi olla myös edellisellä tai seuraavalla rivillä. Virheestä ilmoittaa myös marginaaleissa oleva lamppu, jonka päällä on punainen rasti.
Pikakorjaus: Eclipse osaa itse korjata osan virheistä Quick Fix-toiminnolla. Kun Quick Fix-toimintoa voi käyttää, ilmoittaa Eclipse virheestä marginaalissa lampulla, jonka päällä on punainen rasti. Nyt hiiren oikeaa nappia painamalla löytyy Quick Fix-toiminto. Toimintoa käyttämällä ohjelma ehdottaa ratkaisuja ohjelman korjaamiseksi ja valinnan jälkeen myös tekee korjaukset automaattisesti. Nopeampi tapa käyttää Quick Fix:ä on viedä kursori riville, jolla virhe on, ja painaa Ctrl+1. Jos kirjoitamme aliohjelma-kutsun ennen aliohjelman määrittelyä, osaa Quick Fix luoda luoda meille rungon aliohjelman määrittelyä varten.
Koodintäydennys: ctrl + space
Sun Microsystemsin kehittämä tietoverkkoihin suunnattu olio-ohjelmointikieli, jonka tarkoitus oli alunperin olla kevyehkö kieli sulautettuja järjestelmiä varten ja käyttää Javaa elektroniikassa, kuten telvesisioissa, videioissa jne. Rakennettu C++ pohjalta, jolle tyypillisiä piirteitä ovat:
Javassa ei ole seuraavia C:n tai C++:n ominaisuuksia:
Aloitetaan kirjoittamalla klassinen Heippamaailma-sovellus ja tarkastellaan, mitä puhtaalla oliokielellä tarkoitetaan:
public class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
Ensimmäisellä rivillä määritellään luokka (class) jonka nimi on HelloWorld. Javassa luokkien nimet alkavat aina isolla kirjaimella. Luokan edessä oleva public-määre tarkoittaa, että luokka on julkinen, kuten luokat useimmiten ovat. Jokainen Java-ohjelma on kirjoitettava luokan sisään, joten jokaisessa Java-ohjelmassa on tällöin vähintään yksi luokka. Luokan, jonka sisään Java-ohjelma kirjoitetaan, on oltava samanniminen kuin tiedoston nimi. Jos tiedoston nimi on HelloWorld.java on luokan nimen siis oltava HelloWorld
Rivillä kolme määritellään uusi aliohjelma nimeltä main. Nimensä ansiosta se on tämän luokan pääohjelma. Pääohjelma täytyy Javassa aina määritellä yllä olevassa muodossa. Samoin kuin luokan, niin myös pääohjelman sisältö kirjoitetaan aaltosulkeiden sisään.
Rivillä viisi tulostetaan näytölle Hello World!. Javassa tämä tapahtuu pyytämällä Javan standardikirjaston System-luokan out-oliota tulostamaan println-metodilla.
Yhden rivin kommentteja käytetään usein, kun ohjelman suoritus tapahtuu poikkeuksellisesti (tai sitten kirjoittamaan muistiin, mitä kummaa tuli tehtyä). Esimerkiksi if (i < MONTHSINYEAR - 1) olisi syytä kertoa, miksi tutkitaan vakio miinus yksi.
//Yhden rivin kommentti
Useamman rivin kommenttien avulla muodostetaan luokan dokumentaatio.
/* Tässä
on
useamman
rivin
kommentti */
HelloWorld-esimerkin dokumentointi
/**
* Esimerkkiohjelma, joka tulostaa tekstin "Hello World!"
*
* @author: Ari Tuhkala
* @date: 11.1.2015
*/
public class HelloWorld {
/**
* Pääohjelmassa tulostetaan Hello World!
* @param args ei käytössä
* @return void ei palauta mitään
*/
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
HelloWorld.java lähdekoodi käännetään Java kääntäjällä (compiler) tavukoodiksi. Ennen kääntämistä kääntäjä tarkistaa koodin syntaksin. Kääntäminen komentorivillä: javac HelloWorld.java
Tavukoodi on käyttöjärjestelmäriippumatonta koodia, jonka suorittamiseen tarvitaan Java-virtuaalikonetta (Java Virtual Machine). Java-virtuaalikone on oikeaa tietokonetta matkiva ohjelma, joka tulkkaa tavukoodia ja suorittaa sitä kohdekoneen prosessorilla. Tässä on merkittävä ero perinteisiin käännettäviin kieliin (esimerkiksi C ja C++), joissa käännös on tehtävä erikseen jokaiselle eri laitealustalle. Jokaisella käyttöjärjestelmällä (Windows, Linux, Macintosh, mobiililaitteet, ym.) on oltava oma Java-virtuaalikone, koska jokainen käyttöjärjestelmä toimii eri lailla. Ohjelman suorittaminen komentorivillä: java HelloWorld
Muuttuja määritellään (declare) kirjoittamalla ensiksi tietotyyppi ja sen perään muuttujan nimi. Muuttujan nimet aloitetaan Javassa pienellä kirjaimella, jonka jälkeen jokainen uusi sana alkaa aina isolla kirjaimella.
// esimerkiksi
int henkilonIka;
// useampia muuttujia kerralla
double paino, pituus;
Java on vahvasti tyypitetty kieli, mikä tarkoittaa käytännössä seuraavaa: Muuttuja täytyy olla määritelty ennen kuin siihen voi asettaa arvoa ja muuttujaan voi asettaa vaan määrittelyssä annetun tietotyypin mukaisia arvoja tai sen kanssa sijoitusyhteensopivia arvoja.
// kääntyy
double liukuluku;
int kokonaisluku = 4;
liukuluku = kokonaisluku;
// ei käänny
int kokonaisluku;
double liukuluku = 4.0;
kokonaisluku = liukuluku;
// arvo voidaan sijoittaa määrittelyn yhteydessä
int kokonaisluku = 10;
int toinenluku = kokonaisluku
// huom. kirjain ja merkkijono
char kirjain = 'c';
String sana = "loskakeli";
Javassa aritmeettisten operaattoreiden suoritusjärjestys on vastaava kuin matematiikan laskujärjestys. Seuraavassa taulukoituna operaattorit:
Huom: jakojäännös:
Kun yritetään tallentaa kokonaislukujen jakolaskun tulosta liukulukutyyppiseen (float tai double) muuttujaan, voi tulos tallettua kokonaislukuna, jos jakaja ja jaettava ovat molemmat ilmoitettu ilman desimaaliosaa.
double laskunTulos = 5 / 2;
System.out.println(laskunTulos); //tulostaa 2.0
Jos kuitenkin vähintään yksi jakolaskun luvuista on desimaalimuodossa, niin laskun tulos tallentuu muuttujaan oikein.
double laskunTulos = 5 / 2.0;
System.out.println(laskunTulos); //tulostaa 2.5
Liukuluvuilla laskettaessa kannattaa pitää desimaalimuodossa myös luvut, joilla ei ole desimaaliosaa, eli ilmoittaa esimerkiksi luku 5 muodossa 5.0.
Javassa ei tietyn tyyppiseen muuttujaan voi tallentaa kuin yhtä tyyppiä. Tämän takia meidän täytyy joskus muuttaa esimerkiksi String-tyyppinen muuttuja int-tyyppiseksi tai double-tyyppinen muuttaja int-tyyppiseksi ja niin edelleen. Kun muuttujan tyyppi vaihdetaan toiseksi, kutsutaan sitä tyyppimuunnokseksi.
Kaikilla olioilla tulisi olla toString-metodi, jolla olio voidaan muuttaa merkkijonoksi. Merkkijonon muuttaminen alkeistietotyypiksi onnistuu sen sijaan jokaiselle alkeistietotyypille tehdystä luokasta löytyvällä metodilla. Alkeistietotyypithän eivät ole olioita, joten niillä ei ole metodeita. Jokaista alkeistietotyyppiä varten on kuitenkin tehty Javaan niin sanotut kääreluokat, joista löytyy alkeistietotyyppien käsittelyyn hyödyllisiä metodeita. Alkeistietotyyppejä vastaavat kääreluokat löytyy seuraavasta taulukosta:
Automaattisissa tyyppimuunnoksissa käsiteltävä tyyppi muuttuu automaattisesti oikealla puolella olevaksi tyypiksi:
byte -> char -> short -> int -> long -> float -> double
Parsiminen ja alkeistietotyyppien kääriminen:
// merkkijono luvuksi
String luku1 = "24";
int luku2 = Integer.parseInt(luku1)
// alkeistietotyyppi merkkijonoksi
String lukuMerkkijonona = Integer.toString(24);
Javassa:
Verrataan kahta ohjelmaa:
HUOM: tässä kohtaa Graphics.jar lisääminen projektiin
import fi.jyu.mit.graphics.EasyWindow;
/**
* Harjoitellaan piirtämistä EasyWindow-luokan avulla.
* @author vesal
* @version 14.9.2008
*/
public class Lumiukot {
/**
* Piirretään kaksi lumiukkoa.
* @param args ei käytössä
*/
public static void main(String[] args) {
EasyWindow window = new EasyWindow();
//Ensimmäinen lumiukko
window.addCircle(20,80-2*15-20-10,10);
window.addCircle(20,80-15-20,15);
window.addCircle(20,80,20);
//Toinen lumiukko
window.addCircle(70,90-2*15-20-10,10);
window.addCircle(70,90-15-20,15);
window.addCircle(70,90,20);
window.showWindow();
}
}
Ja oliomaisempi:
import fi.jyu.mit.graphics.EasyWindow;
/**
* Piirretään lumiukkoja
* @author vesal
* @version 14.9.2008
*/
public class Lumiukot {
public static void lumiukko(EasyWindow window, double x, double y) {
window.addCircle(x,y-2*15-20-10,10);
window.addCircle(x,y-15-20,15);
window.addCircle(x,y,20);
}
/*
* Pääohjelmassa kokeillaan piirtelyä.
*
* @param args ei käytössä
*/
public static void main(String[] args) {
EasyWindow window = new EasyWindow();
lumiukko(window,20,80); // 1. kutsu
lumiukko(window,70,90); // 2. kutsu
window.showWindow();
}
}
Erilaiset ehtolauseen muodot:
/// yhden ehtolauseen perusmuoto
if (ehto) lause;
/// useamman lauseen ehto
if (ehto) {
lause1;
lause2;
lause3;
}
/// if-else rakenne
if (ehto) lause1;
else lause2;
///else if-rakenne
if (ehto1) lause1;
else if (ehto2) lause2;
else lause3;
///switch-rakenne
switch (valisin)
{
case arvo1:
lauseet;
break;
case arvo2:
lauseet;
break;
case arvo3:
lauseet;
break;
default:
lauseet;
}
Tyypillisimmät toistorakenteet ovat:
///while-silmukka
while (ehto) {
lause1;
lause2;
lauseX;
}
///do-while-silmukka
do {
lause1;
lause2;
lauseX;
} while(ehto);
///for-silmukka
for (muuttujien alustukset; ehto; silmukan lopussa tehtävät toimenpiteet){
lauseet;
}
///esimerkki
for (int i=1; i <= 10; i++) {
lause1;
lause2;
lause3;
}