luokista (class) ja olioista (object)myy.haaga-helia.fi/~ict1td002/iltatiko/osio_2/luennot/... ·...
TRANSCRIPT
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
Ensimmäisen viikon aiheet:
Luokat ja oliot
Luokan attribuutit ja metodit
Oletusmuodostin
Uml-kaavio; yhteyssuhde ja koostumussuhde
Koostumussuhteen toteutus
Lähde Deitel & Deitel 2005: Java How to Program. Sixth Edition.Prentice Hall New Jersey. Sivut 357 – 372.
tiedosto: document.doc
1(24)
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
LUOKISTA (class) JA OLIOISTA (object)
LUOKKA määrittelee toiminallisen kokonaisuuden sisältää:
attribuutit metodit
Esimerkki Ihminen
LUOKKA on tyyppi ja OLIO on sen ilmentymä
Esimerkkiksi ihmisluokan oliot olio1 ja olio2:
tiedosto: document.doc
2(24)
public class Ihminen{
// attribuutitprivate String nimi;private Pvm syntymäaika;private String syntymapaikka;private double paino;private double pituus ;
private char sex; // ‘M’ tai ‘F’
// metoditpublic String pyydaNimi() { … }public String pyydaSyntymäpaikka() { … }public int pyydaIka() { … }
public double pyydaPituus() { … }public double pyydaPaino() { … }
}
piilotettuja tietoja
julkisia metodeja
String nimi:
Pvm syntymaaika:
String syntymapaikka:
double paino:
double pituus :
char sex ;double pyydaPituus();
String pyydaSyntymapaikka();
String pyydaNimi();
double pyydaPaino();
int pyydaIka();
String nimi:”Veikko Virtanen”
Pvm syntymaaika:19.6.1980String syntymapaikka:”Espoo”
double paino:85.0
double pituus :1.84
char sex :’M’
double pyydaPituus();
String pyydaSyntymapaikka();
String pyydaNimi();
olio1:
double pyydaPaino();
int pyydaIka();
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
tiedosto: document.doc
3(24)
String nimi:”Velma Lahtinen”
Pvm syntymaaika:1.5.1965
String syntymapaikka:”Turku”
double paino:67.0
double pituus :1.67
char sex : ‘F’
double pyydaPituus();
String pyydaSyntymapaikka();
String pyydaNimi();
olio2:
double pyydaPaino();
int pyydaIka();
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
LUOKKA on abstrakti tietotyyppi (abstract date type)
käyttäjä tietää, miten luokan ilmentymää, oliota, käytetään
hänen ei tarvitse tietää, miten olio on toteutettu
Kapselointi
Luokan attribuutit ja metodit voidaan kapseloida eli piilottaa luokan sisään (private) tai antaa toisten olioiden käytettäväksi (public)
Miksi?
LUOKKA on valmis paketti, se ei ole (ei pitäisi olla) sidoksissa ympäristöönsä
voidaan käyttää samaa luokkaa useissa sovelluksissa (UUDELLEENKÄYTETTÄVYYS)
Jos olemassaolevan luokan kaikki ominaisuudet eivät riitä uudessa sovelluksessa
käytetään vanhan luokan ominaisuuksia ja metodeja ja periytetään luokka siten, että uudet vaatimukset tulevat täytettyä
ei tarvitse koodata samaa asiaa uudelleen vaan ainoastaan tarvittavat uudet asiat
Entä jos sovellukseen tulee muutoksia (esim. henkilötunnuksen rakenne muuttuu)
muutoskohta pystytään paikallistamaan ja rajallistamaan helposti (YLLÄPIDETTÄVYYS)
tiedosto: document.doc
4(24)
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
LUOKAN määrittely Javallapublic class Time{// piilotetut attribuutit private int hour; private int minute; private int second;
// piilotetut metodit private boolean tarkastaTunti (int h) {
boolean paluu; paluu = ( h < 0 || h >= 24 )? false : true; return paluu;
} private boolean tarkastaMinuutti ( int m) {
boolean paluu; paluu = ( m < 0 || m >= 60 ) ? false : true; return paluu;
} private boolean tarkastaSekuntti ( int s) {
boolean paluu; paluu =( s < 0 || s >= 60 ) ? false : true; return paluu;
}// julkiset metodit public void setTime( int h, int m, int s ) {
if ( tarkastaTunti(h) ) hour = h; else hour = 0;
minute = (tarkastaMinuutti(m) ? m : 0 );
second = (tarkastaSekuntti(s)? s : 0 ); } public String toString() {
return hour+":"+minute+":"+second; } } // end class Time
Piilotetut attribuutit
tiedosto: document.doc
5(24)
julkinen eli public:luokkaa voidaan käyttää myös muualla kuin siinä hakemistossa, johon luokka on talletettu
jos ei määrettä:luokkaaa voidaan käyttää vain hakemiston, johon luokka on talletettu, muista luokista.
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
määritellään sanalla private
ei voi viitata luokan ulkopuolelta vaan ainoastaan luokan omista piilotetuista ja julkisista metodeista.
Esim. public class Time{// piilotetut attribuutit private int hour; private int minute; private int second;// piilotetut metodit private boolean tarkastaTunti (int h) {
boolean paluu; paluu = ( h < 0 || h >= 24 )? false : true; return paluu;
}…
// julkiset metodit public void setTime( int h, int m, int s ) {
if ( tarkastaTunti(h) ) hour = h; else hour = 0;
minute = (tarkastaMinuutti(m) ? m : 0 );
second = (tarkastaSekuntti(s)? s : 0 ); }…}// end of class
Piilotetut metodit
määritellään sanalla private
ei voi kutsua luokan ulkopuolelta vaan ainoastaan luokan omista metodeista.
Esim. // piilotetut metodit private boolean tarkastaTunti (int h) {
boolean paluu; paluu = ( h < 0 || h >= 24 )? false : true; return paluu;
tiedosto: document.doc
6(24)
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
} private boolean tarkastaMinuutti ( int m) {
boolean paluu; paluu = ( m < 0 || m >= 60 ) ? false : true; return paluu;
} private boolean tarkastaSekuntti ( int s) {
boolean paluu; paluu =( s < 0 || s >= 60 ) ? false : true; return paluu;
}// julkiset metodit public void setTime( int h, int m, int s ) {
if ( tarkastaTunti(h) ) hour = h; else hour = 0;
minute = (tarkastaMinuutti(m) ? m : 0 );
second = (tarkastaSekuntti(s)? s : 0 ); }
tiedosto: document.doc
7(24)
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
Julkiset metodit
määritellään sanalla public
voi kutsua luokan ulkopuolelta ja luokan omista metodeista
Esim. // julkiset metodit public void setTime( int h, int m, int s ) {
if ( tarkastaTunti(h) ) hour = h; else hour = 0;
minute = (tarkastaMinuutti(m) ? m : 0 );
second = (tarkastaSekuntti(s)? s : 0 ); } public String toString() {
return hour+":"+minute+":"+second; }
Julkiset attribuutit
määritellään sanalla public
voi viitata luokan ulkopuolelta ja luokan omista metodeista
käyttöä tulisi välttää, sillä sen käyttö huonontaa olio-ohjelmoinnin ajatusmallia (ylläpidettävyys ja uudelleenkäytettävyys).
Esim. Math-luokan kummatkin attribuutit ovat julkisia
public class Math{
public static final double E= 2.718281828459045;public static final double PI=3.141592653589793;
public static double pow (double a, bouble b){
…}
…}
Olion luonti ja tuhoaminen
tiedosto: document.doc
8(24)
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
Luokan ilmentymä (instance of class) eli luokan olio luodaan operaatiolla new() seuraavasti:
Luokka olio = new Luokka ( );
tai
Luokka olio=null;
olio = new Luokka ( );
Olio tuhoutuu automaattisesti, kun mikään muuttuja ei viittaa siihen.
Viittausmuuttuja alustetaan null arvolla, jollei sille heti luoda oliota.
EliLuokka olio = null;
Myöhemmin kun olio-muuttujaa käytetään tulisi tutkia, viittaako muuttuja olioon vai ei.
if (olio != null){
olio.metodinkutsu();…}
Harjoitus: Mitä tapahtuu? Piirrä!
Luokka olio1 = new Luokka();Luokka olio2;
olio2 = olio1;OLION julkiseen attribuuttiin viittaminen
olio.julkinenAttribuutti;
Esim.
Luokka olio = new Luokka ();
tiedosto: document.doc
9(24)
olio:
muuttuja viittaa luotuun olioon
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
System.out.println(olio.jukinenAttribuutti);
OLION julkisen metodin kutsuminen eli tietyn viestin lähettöminen oliolle
olio.metodi();
Esim.Time aika = new Time();
aika.setTime (10, 15, 5);
tiedosto: document.doc
10(24)
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
LUOKAN käyttötapoja
A) Sovellus eli ohjelma toteutetaan Javalla luokan avulla
sovelluksella on attribuutit, eli tiedot joita sovellus käyttää
sovelluksella on vähintään yksi julkinen metodi, joka käynnistää sovelluksen toiminnan.
sovelluksella voi olla useita piilotettuja metodeja
Esim.public class Sovellus{
private int summa;
public void aja() { … } // aja-metodi …
public static void main (String [ ] args) {
// Sovellus-luokan olion luontiSovellus olio = new Sovellus();
// sovelluksen toiminnan aloitusolio.aja();
System.out.println (”*** LOPPU ***”);}
} // end of class
B) www-sivuilla toimiva sovelma (applet) toteutetaan luokan avulla
tiedosto: document.doc
11(24)
Aja-metodissa on sovelluksen/ohjelman logiikka ja toiminta
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
C) käyttäjän määrittelemä käsite toteutetaan luokkana
Esim. public class Henkilo{
private String hetu;private String etunimi;private String sukunimi;
public String toString() { … }….
} jne.
Esimerkkinä ohjelma, joka pyytää suorakulmion sivujen pituudet ja tulostaa ne sekä kulmion alan.
tiedosto: document.doc
12(24)
public class KulmioSovellus{public void aja(){Suorakulmio olio = new Suorakulmio();
olio.setSuorakulmio ( 12, 40);System.out.println (”\nSuorakulmion tiedot: ” + olio); // taiSystem.out.println (”\nSuorakulmion tiedot: ”+olio.toString());
}
public static void main(String [] args ){KulmioSovellus so = new KulmioSovellus();
so.aja();System.out.println ("\n***LOPPU***");
}}// end of class
public class Suorakulmio{private int leveys;private int korkeus;
public void setSuorakulmio (int le, int ko){leveys = ( le >= 0 ) ? le : 0;korkeus = (ko >= 0 ) ? ko : 0;
}public String toString(){return ("leveys: " + leveys +
" korkeus: " + korkeus +" ala: " + korkeus*leveys);
}
}// end of class Suorakulmio
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
tiedosto: document.doc
13(24)
ohjelman toiminta:
Suorakulmio tiedot: leveys: 12 korkeus: 40 ala: 480Suorakulmio tiedot: leveys: 12 korkeus: 40 ala: 480
*** LOPPU ***
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
LUOKAN Muodostimet (constructors)
olion luonnin jälkeen, ohjelmoijan on tiedettävä, mitkä ovat olion attribuuttien arvot, eli olion tila tulee tietää
kieli sisältää ns. metodeita eli muodostimia, joiden avulla olion luonnin yhteydessä olion attribuutit saavat alkuarvonsa
muodostimen kutsu on automaattista ja tapahtuu kun olio luodaan
ohjelmoija ei koodaa kutsua
[poikkeus: muodostin voi kutsua toista muodostinta ensimmäisenä
toimenaan
Esim. this ( mahdolliset parametrit );]
muodostin voidaan kuormittaa, puhutaan kolmenlaisista muodostimista:
oletusmuodostin ( 1 / luokka )
parametrillinen muodostin ( useita / luokka )
kopiointimuodostin ( 1 / luokka )
tiedosto: document.doc
14(24)
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
Oletusmuodostin:
olion attribuutit saavat oletusalkuarvot
Kääntäjä tekee oletusmuodostimen
jos ohjelmoija ei tee sitä itse
luokan attribuutit saavat oletusarvot:
numeerinen attribuutti saa tyyppinsä mukaisen nollan char: ns. null-merkki ’\u0000’ boolean: false kaikki viittaustyyppiset muuttujat saavat arvon null
Ohjelmoijan tekemä oletusmuodostin
Esim. public class Time{// piilotetut attribuutit private int hour; private int minute; private int second;// muodostimet// oletusmuodostinpublic Time ( ) {
hour = 8;minute = 15;second = 0;
}
Oletusmuodostimen kutsu tapahtuu,kun olio luodaan seuraavasti:
Time aika = new Time();
tai
Time aika;aika = new Time();public class Time{// piilotetut attribuutit private int hour; private int minute; private int second;
tiedosto: document.doc
15(24)
muodostimen nimi on luokan nimi
ei parametreja ei tyyppiä näkyvyys public
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
// muodostimet // oletusmuodostin public Time() {
hour = 8;minute = 15;second = 0;
}// piilotetut metodit private boolean tarkastaTunti (int h) {
boolean paluu; paluu = ( h < 0 || h >= 24 )? false : true; return paluu;
} private boolean tarkastaMinuutti ( int m) {
boolean paluu; paluu = ( m < 0 || m >= 60 ) ? false : true; return paluu;
} private boolean tarkastaSekuntti ( int s) {
boolean paluu; paluu =( s < 0 || s >= 60 ) ? false : true; return paluu;
}// julkiset metodit public void setTime( int h, int m, int s ) {
if ( tarkastaTunti(h) ) hour = h; else hour = 0;
minute = (tarkastaMinuutti(m) ? m : 0 ); second = (tarkastaSekuntti(s)? s : 0 ); } public String toString() {
return hour+":"+minute+":"+second; } } // end class Time
public class TimeTesti1{
public void aja(){
Time aika = new Time(); // oletusmuodostimen kutsu
System.out.println("Oletusaika on klo " + aika);
tiedosto: document.doc
16(24)
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
/* tai System.out.println("Oletusaika on klo " +
aika.toString()); */
}
public static void main (String [] args){
TimeTesti1 olio = new TimeTesti1();
olio.aja();
System.out.println("\n***loppu***");}
}
tulostaa:Oletusaika on klo 8:15:0
tiedosto: document.doc
17(24)
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
Olion identiteetti: this
jokaisella oliolla on oma this-muuttujan arvo
this-muuttujaa voidaan käyttää olion metodissa, kun halutaan viitata viestin saaneeseen olioon
Esim.
public class Time{ private int hour; private int minute; private int second;
…public void setHour (int hour){ if (hour >=0 && hour <24) this.hour = hour;
}…
} // end of class
this on viittaus viestin saaneeseen olioon
tiedosto: document.doc
18(24)
Kun olion attribuutin tunnus on sama kuin olion metodin parametri, tunnukset erotetaan toisistaan this-viittauksen
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
toString-metodi
jokainen Java-luokka on periytetty Object-luokasta
Object-luokalta olio perii toString-metodin, mutta metodi ei toimi niin kuin ohjelmoija sen haluaa, eli ohjelmoidaan se itse
Esim. Kun Time-luokalta puuttuu toString-metodi ja suoritetaan seuraavat lauseet:
Time aika = new Time();
System.out.println("Oletusaika on klo " + aika);
Tulostuu: Oletusaika on klo Time@82ba41
Tämä ei kuvaa todellista aikaa, joten Time-luokkaan kannattaa tehdä oma toString-metodi.
public String toString(){
return hour+":"+minute+":"+second;
// tai /*
String paluu; paluu = hour+":"+minute+":"+second; return paluu;
*/ }
tiedosto: document.doc
19(24)
Object
Time
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
Metodin kutsu:
Time aika = new Time();
System.out.println(aika.toString());
// tai
System.out.println(aika); // tapahtuu automaattinen toString-metodin kutsu
String mjono1;
mjono1 = aika.toString();
tiedosto: document.doc
20(24)
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
Luokkienväliset yhteydet; yhteyssuhde ja koostumussuhde
Tilaustietojen kuvaus UML-kaavion (luokkakaavio) avulla.
Yhteyssuhteet ( )
Tilauksella on täsmälleen yksi asiakas, mutta samalla asiakkaalla voi olla useita tilauksia.
Asiakkaalla on täsmälleen yksi postinumero ja postitoimipaikka, mutta samalla postialueella voi olla useita asiakkaita.
Tilausrivi koskee täsmälleen yhtä tuotetta, mutta samalla tuotteella voi olla useita tilausrivejä.
Koostumussuhteet ( )
Tilaus koostuu yhdestä tai useammasta tilausrivistä. Tilausrivi ei elä ilman tilausta.
Tilauksella on 1 tilauspäivämäärä ja 0 tai 1 toimituspäivämäärää. Päivämäärät eivät elä ilman tilausta.
tiedosto: document.doc
21(24)
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
Harjoitus: Tee seuraavasta kuvauksesta luokkakaavio.
Kustantajan tiedot ovat kustantajan tunnus, nimi, puhelinnumero, katuosoite sekä postinro ja postitmp. Kustantaja kustantaa aikakauslehtiä ja yrittää saada lehdilleen tilaajia. Tilaajalla on asiakasnumero, nimi, puhelinnumero, osoite sekä postinro ja postitmp. Tilaus kohdistuu lehteen, jolla on lehden nimi. Tilaukseen kuuluu tilauspäivämäärä ja tilauksen loppumispäivämäärä, tieto siitä onko kyseessä kestotilaus ja lehden tilauksen hinta.
Koostumussuhteen toteuttaminen
tiedosto: document.doc
22(24)
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
kun olio koostuu muista olioista, vallitsee olioiden välillä koostumussuhde (containment relationship)
olioita sisältävää oliota kutsutaan koosteolioksi
koosteolioon sisältyviä olioita kutsutaan osaolioiksi
koosteolion luokka (koosteluokka) muodostaa koosterakenteen (aggregate)
koosterakenne toteutetaan siten, että koosteluokassa on viitteet osaluokkien olioihin
Esim.
Esim. Tapaaminen-luokka on koosteluokka, joka koostuu osaolioista String ja Time.
tiedosto: document.doc
23(24)
public class Tapaaminen{// attribuutitprivate String tilaisuus;private Time klo;
// oletusmuodostinpublic Tapaaminen(){tilaisuus = null;klo = null;}
// metoditpublic void setTilaisuus (String tilaisuus){this.tilaisuus = tilaisuus;}
public void setKlo ( Time klo){this.klo = klo;}
public String toString(){String paluu;
if (tilaisuus != null)paluu = tilaisuus+ " ";
elsepaluu = "? ";
if (klo != null)paluu = paluu + klo;
elsepaluu = paluu + "?";
return paluu;}
}// end of class
public class Naytto{ …
}
public class Nappaimisto{ …}
public class Tietokone{// attribuutit private Naytto naytto; private Nappaimisto nappaimisto; private Cpu cpu; …}
public class Cpu{ …
}
Esim.
HELIA OHJELMOINTITAITOOsion 2 ensimmäinen viikko
Seija Lahtinen 24.9.2005
tiedosto: document.doc
24(24)
public class TapaaminenTesti1{public void aja(){
Tapaaminen tap1;Time aika;String tilaisuus;
tap1 = new Tapaaminen();
System.out.println("\nOletustapaaminen: " + tap1);
aika = new Time();aika.setTime(19, 30, 0);
tilaisuus = "Ooppera, Sevillan parturi";
tap1.setTilaisuus (tilaisuus);tap1.setKlo (aika);
System.out.println("\nTapaaminen: " + tap1);
}
public static void main (String [] args){TapaaminenTesti1 olio = new TapaaminenTesti1();
olio.aja();
System.out.println("\n\n**LOPPU***");}
}// end of class
tulostuu: Oletustapaaminen: ? ?Tapaaminen: Ooppera, Sevillan parturi klo 19:30:0
**LOPPU***