Vertailulauseet Ehtolausekkeet Ehdot, valintalausekkeet Boolean-algebra == yhtäsuuruus!= erisuuruus < pienempi <= pienempi tai yhtäsuuri > suurempi >= suurempi tai yhtäsuuri Esimerkkejä: int i=7; int j=10; Jolloin: i < j == true i >= j == false i!= j == true 1 2 Vertailulauseet Huomaa ero sijoitusoperaatiolla ja vertailuoperaatiolla: = Sijoitusoperaatio == Vertailuoperaatio Esimerkki j = 1; // j saa arvokseen yksi j == 1 // onko j:n arvo yksi? Vertailulauseet Suuremmuutta ja pienemmyyttä tutkivilla operaatioilla voi vertailla vain numeerisia lausekkeita Yhtäsuuruus ja erisuuruus ovat käytössä muidenkin arvojen vertailuissa Esimerkki double d=0.1; double e=0.2; String auto( Auto ); String bussi( Bussi ); d < e == true // Sallittu auto < bussi // Ei sallittu! // Sallittu, mutta ei suositeltu sisällön // vertailuun auto!= bussi 3 4 if-lauseke Ohjelmassa voi olla valintalauseita: if (ehto) // tee jotain // tee jotain muuta if-lauseke ehdon tulee aina olla jokin totuusarvo jos totuusarvo on tosi, suoritetaan iflauseketta seuraava lohko jos totuusarvo on epätosi, suoritetaan -lausekkeen jälkeinen lohko (jos sellainen on olemassa) -osassa voi olla uusi if-lauseke ( if) 5 6
if-lauseke esimerkki 1 public void ispositive(int i) System.out.println( Luku + i ); if (i>0) System.out.println( on positiivinen. ); if (i<0) System.out.println( on negatiivinen. ); System.out.println( on nolla. ); Lohkot Jos valintavaihtoehto koostuu useammasta lauseesta, lauseet on koottava yhteen lohkoksi Lohko on merkkien ja välisten lauseiden jono Lohkon viimeisen aaltosulun jälkeen ei käytetä puolipistettä. 7 8 if-lauseke esimerkki 2 public void ispositive(int i) System.out.println( Luku + i ); if (i>0) System.out.println( on positiivinen. ); dosomething(i); if (i<0) System.out.println( on negatiivinen. ); System.out.println( on nolla. ); if-lauseke moniselitteisyys? if-lauseeseen ei ole pakko liittyä -osaa, jonka vuoksi tulee huomata mihin mikäkin -osa liittyy Esimerkki if (a<b) if (c<d) e=f; g=h; // Tarkoittaako tämä: if (a<b) if (a<b) if (c<d) if (c<d) e=f; e=f; g=h; g=h; Sääntö: -osa liittyy aina lähimpään edeltävään iflauseeseen 9 10 Totuusarvojen yhdistely Totuusarvoilla voi laskea: (a == b) // a ja b yhtäsuuret (a!= b) // a erisuuri kuin b (a && b) // a ja b tosia (a b) // a tai b (!a) // a epätosi Edellä esiteltyjä voi yhdistellä, esimerkiksi: (a b) && (c d) // a tai b ja c tai d 11 switch-lauseke switch-lausekkeella voi olla eri haaroja switch soveltuu paikkoihin, joissa on tarvetta käsitellä monia eri numeroarvoihin perustuvia haaroja switch-lausekkeessa voi olla default-haara, joka suoritetaan mikäli yksikään muu haara ei toteudu switch-lausekkeessa on muistettava break:n käyttö (kts. seuraava esimerkki). break:lla poistutaan switch-lauseesta. 12
switch-lauseke - esimerkki public void printnumber(int i) switch(i) case 0: System.out.println( nolla ); case 1: System.out.println( yksi ); default: System.out.println( ei yksi eikä nolla ); 13 boolean-perustietotyyppi Totuusarvo voidaan sijoittaa booleantyyppiseen perustietotyyppiin boolean isbigger = (a>b); if (isbigger) System.out.println( a is bigger than b ); System.out.println( a isn t bigger than b ); 14 Esiehtoinen toistorakenne Toisto Toistolausekkeet for, while(ehto) ja do while(ehto) Toistorakenteista poistuminen ja niiden sisällä siirtyminen while (ehto) /* suoritettava koodi */ Esimerkki: int poweroftwo = 2; while (poweroftwo < 10) System.out.println( Next power: + poweroftwo); poweroftwo *= 2; 15 16 Esiehtoinen toistorakenne Toistorakennetta suoritetaan niin kauan kun annettu ehto on tosi (true) Mikäli ehto ei ole aluksikaan tosi, ei toistorakennetta suoriteta kertaakaan Jälkiehtoinen toistorakenne do /* suoritettava koodi */ while (ehto); Esimerkki: boolean mayexit = false; do System.out.println( Syötä luku (1-9) : ); int uservalue = Lue.kluku(); if (uservalue>0 && uservalue<10) mayexit = true; while (!mayexit); 17 18
Jälkiehtoinen toistorakenne Toistorakenne suoritetaan vähintään yhden kerran Seuraavalle suorituskerralle siirrytään, mikäli annettu ehto on tosi for-toistorakenne for (alustus;jatkamisehto;lisäyslauseke) /* suoritettava koodi */ Käyttö järkevää kun toistojen lukumäärä on ennakkoon tiedossa Esimerkki for (int i=0;i<10;i++) System.out.println( Luku + i); 19 20 for-toistorakenne (1) (2) (3) for (int i=0;i<10;i++) System.out.println( Luku + i); Tuloste 1) suoritetaan yhden kerran 2) suoritetaan joka kierroksella, jos totuusarvo on false, toistorakenteen suoritus päättyy 3) suoritetaan joka kierroksen lopuksi ennen seuraavan kierroksen kohdan (2) tarkastusta Luku 0 Luku 1 Luku 2 Luku 3 Luku 4 Luku 5 Luku 6 Luku 7 Luku 8 Luku 9 break ja continue toistorakenteissa Kaikissa edellä esitellyissä toistorakenteissa voidaan käyttää break- ja continue-lausekkeita: break-lauseke poistuu toistorakenteesta continue-lauseke siirtyy suoraan seuraavalle suorituskerralle turhaa käyttöä kannattaa välttää 21 22 break ja continue - esimerkki for (int i=0;i<10;i++) if (i==5) continue; if (i==8) System.out.println( Kierros + i); Tuloste: Kierros 0 Kierros 1 Kierros 2 Kierros 3 (1) (2) Kierros 4 Kierros 6 Kierros 7 hyppy seuraavalle kierrokselle, mikäli jatkoehto 1 toteutuu, lisäyslauseke 2 suoritetaan kuten normaalisti poistutaan suoraan for-lausekkeesta 23 ehtojen asettaminen Kaikissa toistorakenteissa käytetään jotakin ehtoa, joka kertoo milloin suoritus lopetetaan Ehdot kannattaa asettaa mahdollisimman rajaaviksi, esimerkiksi: public void printnumbers(int count) for (int i=0;i<count;i++) System.out.println( Luku + i); ei i!=count, ikinä Ikuisten toistojen välttäminen em. ohjelmointityylillä on hyvä tapa koska silloin esim. luvulla 1 kutsuttaessa suoritus ei päättyisi 24
Java 2 API Java 2 API Dokumentaatio Paketit Käyttö Java 2 API (Application Programming Interface) tarjoaa runsaasti valmiita luokkia käytettäväksi ohjelmissa Math lukujen käsittely String merkkijono ja sen käsittely StringTokenizer merkkijonon pätkiminen... Luokkien käyttöohjeet löytyvät käytetyn Javaversion API-dokumentaatiosta: http://java.sun.com/j2se/1.4.2/docs/api/ 25 26 Paketit Paketilla tarkoitetaan samantyyppisten luokkien muodostamaa kokonaisuutta Luokan (käännösyksikön) paketti määritellään tiedoston alussa: package paketin_nimi; Ellei tiedoston alussa ole package-määrettä, class-tiedosto asetetaan nimettömään pakkaukseen Luokan kuuluminen alipakettiin ilmaistaan: package paketin_nimi.alipaketti; Paketit Pakettiin kuuluminen tarkoittaa että luokkaa käytettäessä sen edessä on käytettävä pakkauksen nimeä: pakkaus.luokka x = new pakkaus.luokka(); Käytännössä on järkevämpi käyttää aina import-lausekkeita // Sallii pakkaus1:n kaikkien luokkien käytön import pakkaus1.*; // Sallii pakkaus1:n luokan Auto käytön import pakkaus1.auto; import-lausekkeet kirjoitetaan tiedoston alkuun mahdollisen package-määrityksen jälkeen Tiedostosta käy selkeästi ilmi mitä pakkauksia se käyttää 27 28 Java 2 API Kaikki Java 2 API:n luokat on sijoitettu paketteihin java.lang java.math java.io... Paketti, johon luokka kuuluu selviää APIdokumentaatiosta Kaikkiin tiedostoihin tuodaan automaattisesti Javan pakkaus java.lang. (import java.lang.*;) Metodit Metodin muoto Määreet Arvotyyppi Parametrit Kuormittaminen Rekursio 29 30
Metodit Alialgoritmit (aliohjelmat) toteutetaan metodeissa Metodeilla voi olla parametreja (lähtötiedot) ja se voi palauttaa jonkin arvon Metodien käyttö olioiden luonti (konstruktori) piilossa olevan tiedon kysely ja käyttö (aksessorit) algoritmit pääohjelmametodi public static void main(string[] args) 31 Metodit Muoto määreet arvotyyppi nimi(parametrit) algoritmi Määreillä ohjataan metodin käyttömahdollisuuksia Arvotyyppi kertoo minkä tyyppisen arvon metodi palauttaa Nimi yksilöi metodin Parametrit ovat metodin muuttujia, jotka metodin kutsuja antaa Algoritmi toteuttaa metodin tehtävän Esimerkki: public static void printstring(final String str) System.out.println(str); 32 Metodit Muoto Konstruktoreilla ei ole paluuarvoa public Student(String name)... public Car()... Konstruktori ei voi olla staattinen (static) Konstruktori voi olla normaalin publicnäkyvyysalueen lisäksi myös private Milloin järkevää käyttää? Metodit - Määreet Määreitä ovat Näkyvyysalueet public sallii metodin käytön kaikkialta protected sallii metodin käytön luokalta perityissä luokissa private sallii metodin käytön ainoastaan luokan sisällä Muut abstract metodilla ei ole toteutusta (abstrakti) static metodin kutsumiseen ei tarvita oliota final metodia ei voi ylikirjoittaa perityissä luokissa syncronized metodia suoritetaan monisäikeisessä sovelluksessa yksi kutsu kerrallaan native metodilla ei toteutusta, kutsu esim. C/C++ Kurssilla tarvittavat määreet: public, private, static 33 34 Metodit - Määreet Esimerkkejä määreistä public static void main(string [] args) private int solvesubproblem() public int solveproblem() public void initializeobject() Metodit määreet static Yleensä luokan sisään kirjoitetut metodit käyttävät jotain olion attribuuttia On olemassa kuitenkin myös metodeja, jotka eivät tarvitse olion attribuutteja tai kutsu toisia olion attribuutteja käyttäviä metodeja (esim. Math-luokan metodit) Kyseiset metodit eivät näin ollen tarvitse olemassa olevaa oliota suoritukseensa Tällaisia metodeja kutsutaan staattisiksi 35 36
Metodit määreet static Metodi määritellään staattiseksi staticmääreellä: public static double sqrt(double num) static-määreellä määriteltyä metodia voidaan kutsua luokan ulkopuolelta ilman olion luontia: double result = Math.sqrt(16); Luokan nimi, jossa metodi on määritelty 37 Staattiset attribuutit Attribuutteja voidaan määrittää myös staattisiksi. Staattinen attribuutti on käytettävissä ilman olion luontia. Staattista attribuuttia voi käyttää kuten normaaliakin luokan attribuuttia. Staattinen attribuutti on sama joka paikassa (vrt. ei-staattiset attribuutit, jotka ovat yksilölliset jokaisella luodulla oliolla) 38 Staattiset metodit/attribuutit ovat käyttöalueeltaan rajatumpia kuin eistaattiset Hyvän ohjelmointitavan mukaista on määrittää metodi/attribuutti staattiseksi aina kun se on mahdollista Käytännössä varsinkin staattisten attribuuttien käyttö on harvinaista Esimerkkejä: main-metodin on aina oltava staattinen Vakiot määritetään yleensä staattisina: private final static int NUM_COLS = 5; Color-luokan määritellyt värit ovat staattisia public final static Color black = new Color(0,0,0); Math-luokan kaikki metodit ja attribuutit ovat staattisia 39 40 Luokan ulkopuolelta: public class TestApp public static final int A = 1; TestApp.setValues(); public final int B = 2; int i = TestApp.A; private static int C = 3; i = TestApp.B; private int D = 4; i = (new TestApp()).B; (new TestApp()).setValues(); public TestApp() //Ei sallittu (new TestApp()).setMemberValues(); public static void setvalues() C = A; // Sallittu, koska A ja C staattisia A = C; // Ei sallittu, koska A on vakio (final) D = C; // Ei sallittu, koska D ei staattinen setmembervalues(); // Ei sallittu, koska ollaan staat. metodissa public void setmembervalues() C = A; // Sallittu D = C; // Sallittu, koska ei olla staattisessa metodissa setvalues(); // Sallittu 41