812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa
Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää n Ei edellytä luokasta luotua oliota n Piirteeseen viitataan LuokanNimi.piirteenNimi 2
Luokkakohtaiset piirteet n Luokkakohtaiset piirteet määritellään käyttäen staticavainsanaa public class Opiskelija { private static int luotujenlukumaara; //luokkakoht atrib. private int monesko; //oliokohtainen attrib. private String nimi; //oliokohtainen attrib. public Opiskelija(String nimipar){ luotujenlukumaara++; nimi = nimipar; monesko = luotujenlukumaara; } public static int getlukumaara(){ return luotujenlukumaara;} public String tostring(){ return("olen +nimi+" ja numeroni on +monesko+" ja meita on kaikkiaan +luotujenlukumaara); 3
Luokkakohtaiset piirteet import java.io.*; public class OpiskelijaDemo { public static void main(string [] args){ Opiskelija op1 = new Opiskelija("Kalle"); System.out.println(op1); Opiskelija op2 = new Opiskelija("EinoMies"); System.out.println(op2); System.out.println(op1); System.out.println("Opiskelijoiden lukumaara: "+ Opiskelija.getLukumaara()); 4
Luokkakohtaiset piirteet olen Kalle ja jarjestysnumeroni on 1 ja meita on kaikkiaan 1 olen EinoMies ja jarjestysnumeroni on 2 ja meita on kaikkiaan 2 olen Kalle ja jarjestysnumeroni on 1 ja meita on kaikkiaan 2 Opiskelijoiden lukumaara: 2 5
Luokkakohtaiset piirteet n Luokkakohtaississa metodeissa ei voi käyttää this-viittausta oliokohtaisia piirteitä n esim. getlukumaara ei voi käyttää monesko attribuuttia n Luokkakohtaisen attribuutin voi alustaa luokkakohtaisella alustajalla public class Satunnaisluku { public static final int SATUNNAISLUKU; static { Random rand = new Random(); SATUNNAISLUKU = rand.nextint(100); 6
Luokkakohtaiset piirteet n Luokkakohtaiset metodit ovat työkalumetodeja n esim. Math-luokan matemaattiset operaatiot n Tehdasmetodi Vaihtoehto rakentajille (konstruktoreille) Huolehtii olion luomisesta Esim. String luokan valueof metodit public static String valueof(boolean b){ return b? true : false ; 7
Luokkakohtaiset piirteet n Ainokainen Oliosta luodaan vain yksi instanssi Kaikki pääsevät käsiksi Luokan kaikki rakentajat yksityisiä, vain luokan sisällä voi luoda instanssin public class Ainokainen{ public static final Ainokainen AINOKAINEN = new Ainokainen(); private Ainokainen(){ 8
Luokkakohtaiset piirteet n Ainokaisen voi luoda myös toisin Käytetään tehdasmetodia public class Ainokainen{ private static final Ainokainen AINOKAINEN = new Ainokainen(); private Ainokainen(){ public static Ainokainen getinstance(){ return AINOKAINEN; 9
Pakkaukset ja luokkien tuonti Pakkausten (package) avulla hallinnoidaan luokkakokonaisuuksia Yhteenkuuluvat luokat samaan pakkaukseen Javassa kansio, jonne luokka talletetaan Hierarkkinen rakenne, Java-ympäristön pakkaukset pakkauksen java alipakkauksissa java.lang, kielen perusluokat java.io, tiedostoihin ja tietovirtoihin liittyvät luokat java.util, yleiskäyttöisiä luokkia jne pakkauksilla voi olla alipakkauksia 10
Pakkaukset n Omat luokat kannattaa jakaa asiakokonaisuuksittain pakkauksiin n Pakkaukset otetaan käyttöön import lauseella n Alussa pakkauksen nimi, piste ja luokan nimi import java.util.scanner; n Jos samasta pakkauksesta käytetään useita luokkia, käytetään luokan nimen paikalla tähteä import java.io.*; n Jokaiseen käännösyksikköön tuodaan automaattisesti java.lang pakkauksen luokat mm. String ja System 11
Pakkaukset n Pakkaukset luovat nimiavaruuden n Samannimisiä luokkia voi olla eri pakkauksissa n Samaan käännösyksikköön eri pakkauksista tuotavat samannimiset luokat on eroteltava toisistaan java.util.list java.awt.list n import -määrittelyllä voidaan tuota myös luokkakohtaisia piirteitä, joita voi käyttää suoraan piirteen nimellä import java.lang.math.pi; import java.lang.math.pow; 12
Pakkaukset import static java.lang.math.pi; import static java.lang.math.pow; public class YmpyranAlanLaskuri { public static double laskeympyranala(double r){ return PI * pow(r, 2.0); 13
Rajapintaluokka (liittymä, interface) n Rajapintaluokassa määritellään vain metodien otsikot n Rajapinnan toteutus ja rajapinta erotetaan toisistaan (java SE 8:ssa voi olla myös metodin oletustoteutus) n Metodit automaattisesti abstrakteja medodeja n Abstraktin metodin määrittely päättyy puolipisteeseen n Rajapinnan dokumentointi oleellista n Metodit on kuvattava niin tarkasti, että toteuttaja osaa toteuttaa ne ja metodien käyttäjä osaa niitä käyttää 14
Rajapintaluokka n Ainoastaan abstrakteja metodeja sisältävän rajapintaluokan merkitys on staattinen, ei vaikutusta olioiden suoritusaikaiseen käyttäytymiseen n Rajapinnan toteuttavan luokan on toteutettava kaikki rajapinnan abstraktit metodit n Toteuttavia luokkia voi olla useita n Rajapinnan määrittelyssä käytetään sanaa interface sanan class tilalla n Määrittely muistuttaa luokan määrittelyä n Rajapintaluokkaa käyttävän luokan toteutuksessa käytetään implements-avainsanaa 15
Rajapintaluokka interface Ajattelija{ public String ajattele(); class Koomikko implements Ajattelija { private String ajatus; public Koomikko(String nimi, String aatos) { ajatus = aatos; public String ajattele(){ return ajatus; Lähde:Ari Vesanen Olio-ohjelmoiti 2010 16
Rajapintaluokka n Luokka voi toteuttaa usita rajapintaluokkia, rajapintojen nimet erotetaan pilkuilla esim. String-luokka public final class String implements Serializable, CharSequence, Comparable<String> { //... n Aina ei voi toteuttaa yhtäaikaa monta liittymää 17
Rajapintaluokka interface RajapintaA{ public void lisaa(object o); //lisäys viimeiseksi public void poista(); //poista olio interface RajapintaB{ public void lisaa(object o);//lisäys ensimmäiseksi public Object poista(); //poista ja palauta poistettu olio n Molemmat rajapinnat ytäaikaa toteuttavaa luokkaa ei voi toteuttaa Samalle metodille (lisaa) ei voi tehdä kahta erialista toteutusta, koska otsikot ovat samat 18
Rajapintaluokka poista-metodin kohdalla metodin paluuarvo ei tee vielä eroa metodien välille n Java 8 sallii rajapintaluokan metodeille oletustoteutuksen, metodi on tällöin konkreetti eli ei-abstrakti n Mahdollistaa metodien lisäämisen rajapintaluokkaan niin että rajapinnan toteuttaviin luokkiin ei tarvitse tehdä muutoksia jälkikäteen n Oletusmetodin määrittelyssä käytetään defaultavainsanaa 19
Rajapintaluokka public interface DoubleJoukko { //... /* palauttaa joukon lukujen summan */ public default double summa(){ double summa = 0.0; for( double doublearvo: taulukko){ summa = summa + doublearvo; return summa; public class TaulukkoDoubleJoukko implements DoubleJoukko { //... public double summa(){ return summa; 20