- Ohj2, luennot 8-10, 11.3.-12.3.2005
- Täydennystä edelliseen luentoon
- Parametrin välitys
- Metodien kuormitus
- Parametrien välitysmekanismi (ks. Aikalisa.java ja "konekieli"esimerkki)
- "globaalit" muuttujat (static)
- Ohjausrakenteet ja operaattorit (itseopiskeluna, ks. myös javasilm -esimerkkihakemisto)
- Huom. "käännetty" if-lause saattaa selkeyttää
- Esim. if (1 == a), vrt. (a==1)
- Muista: ehto (1 <= a <= 2) ei toimi oikein, pitää kirjoittaa ((1<=a) && (a<=2))
- Materiaali
- olioista yleisesti
- määritelmiä: TIJ, luku 1
- Käytännöllinen määritelmä (Booch)
- Oliolla on tila (attribuutit), käyttäytyminen (metodit) ja identiteetti (esim. muistiosoite)
- identiteetistä seuraa, että oliot, joilla on sama tila, voiidaan erottaa toisistaan
- vrt. matemaattisilla olioilla ei ole tässä mielessä identiteettiä
- Puhdasoppinen määritelmä (Kay)
- Kaikki ovat olioita (huom. ei päde javassa, mutta smalltalkissa pätee)
- Ohjelma on kokoelma keskenään viestiviä olioita
- Jokaisella oliolla on muista olioista koottu muisti
- Jokaisella oliolla on tyyppi
- Kaikki saman tyypin oliot voivat vastaanottaa samoja viestejä
- rakenteisesta ohjelmoinnista olio-ohjelmointiin
- kalvo: C (rakenteinen ohjelmointi) vs Java (rakenteinen ohjelmointi) -ajattelutavat
- rakenteinen ohjelmointi
- tietueita ja taulukoita käsitellään funktioilla, jotka ryhmitellään moduuleihin
- tiedot ovat julkisia
- toiminnallisuudessa suositaan perusohjausrakenteita: funktiokutsu, silmukka ja ehtolauseet (ei gotoa)
- helppoa toteuttaa, mutta ylläpidettävyys kärsii
- oliolähestymistapa: käsitteellistä mallinnusta
- vrt: semanttiset verkot
- helpottaa ongelma-alueen ymmärtämistä - kuvataan asiat niiden omilla nimillä
- yli- ja aliluokat muodostavat tyyppihierarkian
- olio-ohjelmointi
- kootaan tiettyyn käsitteeseen liittyvät tiedot ja funktiot yhteen olioiksi
- evoluutiota:
- assembler ym. tiedot ja data täysin erillään
- rakenteinen ohjelmointi (c ym): julkisia tietotyyppejä ja kirjastoja, joilla niitä käsitellään
- olio-ohjelmointi: tietotyyppien toteutukset piilotetaan ja 'kirjastofunktiot' muutetaan käsittelemään suoraan luokan ilmentymää
- ""uusia" asioita: perintä ja dynaaminen sidonta (virtuaalifunktiot)
- olio on luokan ilmentynä
- luokka on "muotti", joka kuvaa olion rakenteen
- jokaisella oliolla on oma tilansa (sisäiset muuttujat), mutta metodien toteutukset ovat syntaksista huolimatta luokkakohtaisia (so. muistissa on vain yksi 'kopio' tiettyä luokkaa edustavien olioiden metodeista)
- tiedot (attribuutit) kapseloidaan olion sisälle, ohjelmoinnissa painopiste on olion toiminnassa (metodit)
- metodit ovat yleensä olion julkinen rajapinta (tietysti voi olla myös yksityisiä metodeja)
- tiedon kapselointi edistää ylläpidettävyyttä (sisäinen toteutus voidaan vaihtaa)
- esimerkki: aikalisä
- terminologiaa
- attribuutti "=" muuttuja
- erityisesti tietyn olion tilaa kuvaava muuttuja!
- metodi "=" operaatio "=" jäsenfunktio
- metodille ominaista ovat viestimäisyys ja polymorfisuus - metodilla on aina jokin 'vastaanottaja' ja sen toteutus saattaa vaihdella oliosta riippuen.
- kapselointi: olion sisäisen tilan piilotus ulkopuolisilta
- konstruktori, muodostin: metodi, jota kutsutaan automaattisesti, kun olio alustetaan
- C++:ssa, Delphissä ym. olisi myös destruktori, jota kutsutaan oliota tuhottaessa. Javassa lähimpänä on finalize-metodi, jota tavallisesti ei kuitenkaan tarvita
- luokista ja olioista
- muistinhallinta
- huom. merkkaa aina pöytätesteihin, milloin olio muuttuu 'roskaksi'
- suojaustasot
- käytä aina rajoittavinta tilanteen mahdollistavaa suojaustasoa
- sisäinen tilan valvonta
- keskitä tiettyyn asiaan liittyvä toiminta yhteen metodiin, jota muut mahdollisesti kutsuvat!
- vrt. lisaa-metodin käyttö Aika4:ssä
- 'näkymätön ' this (Aika5)
- 'näkyvä' this-parametri olisi tapa tehdä oliomaista ohjelmointia C:llä
- konstruktori
- vastaa olion tilan alustamisesta
- voi olla useampia (kuormitus)
- toista saman luokan konstruktoria voi kutsua this-muuttujalla. mahdollista yliluokan konstruktoria on kutsuttava erikseen super-muuttujan avulla.
- kutsuttava konstruktorin alussa
- huom. jos super-kutsua ei ole, kutsutaan yliluokan oletusmuodostinta automaattisesti!
- vrt. AikaB ja AikaSekB
- jos luokalle ei ole kirjoitettu yhtään konstruktoria, parametriton oletuskonstruktori luodaan automaattisesti
- huom. luokan attribuutit alustetaan automaattisesti 0:ksi tai null-arvoksi, jos ei muuta mainita
- VAROITUS: konstruktorien (ja destruktorien) tarkka käyttäytyminen luokkahierarkiassa vaihtelee eri oliokielissä (esim. C++, Java ja Object Pascal -kielissä on jokaisessa hieman erilainen logiikka, vaikka kielet ovat muuten hyvin samankaltaisia!)
- Kokeile esim. debug-tulosteilla eri tason konstruktoreissa
- luokan toiminnallisuuden laajentaminen
- muutetaan luokkaa
- koostetaan luokka osaksi uutta (HAS-A -suhde, AikaSek7)
- peritään uusi luokka (IS-A -suhde, AikaSek8)
- vrt. polymorfisen taulukon läpikäyntiä koostettaessa
- kapselointi
- saantimetodit: AikaC
- sisäisen esityksen muuttaminen: AikaD
- Esimerkit
- Moniste: olioalk-hakemisto
- Aika
- Astia (ks. myös win-versio)
- Kerho, vaihe 3
- Huom. harkkatyön vaiheessa 3 oltava myös alivalikot
- Ks. myös luku 10, switch/case ym