Luentokalvot - Abstraktit tietotyypit ja olio-ohjelmointi

*x++=*y++
815338A
Ohjelmointikielten
periaatteet
2014 - 2015
V Abstraktit tietotyypit ja olioohjelmointi
*x++=*y++
Sisältö
I.
Abstraktit tietotyypit
1. Johdatus abstrakteihin tietotyyppeihin
2. Abstraktit tietotyypit Adassa
3. Abstraktit tietotyypit C++:ssa
4. Abstraktit tietotyypit Javassa
II. Olio-ohjelmointi
1. Johdatus olio-ohjelmointiin
2. Periytyvyys
3. Monimuotoisuus ja dynaaminen sidonta
4. Oliokielten suunnittelukysymyksiä
5. Olio-ohjelmointi C++:ssa
6. Olio-ohjelmointi Javassa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
2
*x++=*y++
V.I.1 Abstraktit tietotyypit: Johdatus



Abstract Data Type (ADT)
Data-abstraktion väline
 Data-abstraktio: yhdistetään tietotyyppeihin
operaatioita, joiden yksityiskohtia käyttäjän ei tarvitse
tuntea
Johtivat olio-ohjelmoinnin syntyyn
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
3
*x++=*y++
V.I.1.1. Abstraktin tietotyypin määritelmä
Toteutettava kaksi ehtoa:
1. Tiedon kätkentä: Tyypin määrittelyn ja operaatioiden
yksityiskohdat eivät näy tietotyypin ulkopuoliselle
käyttäjälle
 Tyyppiin voidaan kohdistaa suoraan ainoastaan
sellaisia operaatioita, jotka tyypin esittely sallii
2. Tiedon kapselointi: Tyypin esittely samoin kuin
tietotyyppiin liittyvät operaatioiden esittelyt sijaitsevat
yhdessä syntaktisessa yksikössä. Muut ohjelmayksiköt
voivat muodostaa tämän tyypin muuttujia

Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
4
*x++=*y++
V.I.1.1. Abstraktin tietotyypin määritelmä (2)

HUOM! Määritelmän mukaan myös kielen sisäiset
tietotyypit voivat olla abstrakteja. Tässä ADT:llä
tarkoitetaan käyttäjän määrittelemää abstraktia
tietotyyppiä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
5
*x++=*y++
V.I.1.2. Tiedon kätkentä



Erittäin tärkeä periaate tietotyypin luotettavuuden
kannalta
Ainoastaan tietotyypin sisäiset operaatiot voivat
väliaikaisesti rikkoa tyypin ilmentymän tilan, palauttavat
sen ennen kontrollin siirtymistä käyttäjälle
Helpottaa koodin ylläpitoa, koska ulospäin näkyvä
rajapinta säilyy samana
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
6
*x++=*y++
V.I.1.3. Tiedon kapselointi



Periaatteena koota data ja sitä käsittelevät operaatiot
yhteen
Helpottaa ohjelman loogista ja teknistä hallintaa
 Loogisesti yhteenkuuluvat operaatiot samaan
yksikköön -> mentaalinen hallinta helpottuu
 Teknisesti helpottaa ohjelman kääntämistä
Alisteisissa kielissä kapseloinnin toteuttaminen on
ongelmallista
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
7
*x++=*y++
V.I.1.4. Historiaa lyhyesti



ADT:t ensimmäiseksi SIMULA 67-kielessä
 Määriteltiin luokkana
 Sisälsi luokan muuttujat, aliohjelmien esittelyt sekä
niiden koodin
 Luokassa määriteltyjä muuttujia ei piilotettu olion
luovalta sovellukselta -> tiedon kätkennän toteutus
puutteellinen
ADT:t yleistyivät vasta useita vuosia SIMULA 67-kielen
julkaisun jälkeen
Useimmissa nykyisissä korkean tason kielissä voidaan
käyttää abstrakteja tietotyyppejä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
8
*x++=*y++
I.1.5. ADT eri kielissä



Pascal ja C: voidaan määritellä omia tyyppejä, mutta
niihin ei voi kytkeä operaatioita -> ADT-toteutus
mahdoton
Ada: ADT ilman olioita
C++, Java: luokkien avulla voidaan määritellä
abstrakteja tietotyyppejä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
9
*x++=*y++
V.I.2. Abstraktit tietotyypit Adassa

Adassa ADT:tä voidaan simuloida käyttämällä
pakkauksia (packages)
 Pakkauksilla voidaan kapseloida tietoja
 Koostuvat kahdesta osasta, joita molempia myös
kutsutaan pakkauksiksi:
1. Määrittelyosa (specification package)
2. Runko (body package) (vapaaehtoinen)

Pakkausta käyttävä sovellus näkee aina vain määrittelyosan,
mutta ei runkoa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
10
*x++=*y++
V.I.2. Abstraktit tietotyypit Adassa (2)


Tiedon kätkentä: pakkauksen määrittelyosa voidaan
jakaa julkiseen ja yksityiseen osaan
 Julkinen osa kokonaisuudessaan näkyvissä
pakkauksen käyttäjille
 Yksityinen (private-määreellä merkitty) osa
käyttäjältä piilotettu
 Oletus: tieto julkista
HUOM! Pakkaukset eivät ole varsinaisia tietotyyppejä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
11
*x++=*y++
V.I.2. Abstraktit tietotyypit Adassa (3)

Esimerkki.
package LINKITETTY_LISTA is
type SOLMU;
type OSOITIN is access SOLMU;
type SOLMU is
record
DATA: INTEGER;
LINKKI: OSOITIN;
end record;
end;
package body LINKITETTY_LISTA is
-- Paketin runko
end;
 Pääsy myös SOLMU –tyypin kenttiin DATA ja LINKKI
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
12
*x++=*y++
V.I.3 Abstraktit tietotyypit C++:ssa

Data-abstraktio luokkien avulla
 Erot Adan abstraktiomalliin:



C++ -luokat ovat tietotyyppejä (toisin kuin Adan pakkaukset)
-> C++:ssa voidaan määritellä luokkatyyppisiä muuttujia
Luokkien julkisiin (ei-staattisiin) jäsenmuuttujiin voidaan
viitata ainoastaan luokan instanssin kautta, Adassa
sisällytetyn pakkauksen muuttujiin voidaan viitata suoraan
C++ :n luokka
 C-kielen tietueen (struct) laajennus
 Luokkien operaatiot = jäsenfunktiot
 Luokkamalli muistuttaa SIMULA 67:n mallia
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
13
*x++=*y++
V.I.3 Abstraktit tietotyypit C++:ssa (2)

Luokan jäsenmuuttujien (member variables) ja funktioiden (member functions) näkyvyys
 Julkiset (public)

Näkyvissä ulkopuolelle
 Suojatut (protected)

Näkyminen liittyy periytymiseen
 Yksityiset (private)

Näkyvät ainoastaan luokan sisällä ja luokan ystäväluokissa
ja –funktioissa (friend classes, friend functions)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
14
*x++=*y++
V.I.3 Abstraktit tietotyypit C++:ssa (3)

Viittaukset jäseniin
 Olio: pistenotaatio (.)


Luokka olio;
olio.funktio();
 Osoitin olioon, nuoli (->)


Luokka* p_olio;
p_olio->funktio();
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
15
*x++=*y++
V.I.3 Abstraktit tietotyypit C++:ssa (4)


Staattiset jäsenmuuttujat kaikille luokan olioille yhteisiä
jäsenmuuttujia
 Määritellään C++:ssa avainsanalla static
 Voidaan viitata suoraan ilman oliota luokan nimellä
(Luokka::jäsen)
 Näkyvyyssäännöt myös voimassa
Staattiset jäsenfunktiot (luokkametodit): kutsuttaessa ei
tarvita luokasta oliota
 Avainsana static
 Luokkametodi voi viitata vain luokan staattisiin
jäsenmuuttujiin tai staattisiin jäsenfunktioihin
 Näkyvyyssäännöt myös voimassa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
16
*x++=*y++
V.I.3 Abstraktit tietotyypit C++:ssa (5)


Muodostin (konstruktori, constructor)
 Kutsutaan aina olion luomisen yhteydessä
 Konstruktorin nimi on aina sama kuin luokan nimi
 Ei paluuarvoa
 Muodostinfunktioita voi olla useita -> parametrilistan
perusteella päätellään, mitä muodostinta kutsutaan
Hajotin (tuhoaja, destructor)
 Kutsutaan automaattisesti, kun olio tuhotaan
 Hajotin yksikäsitteinen, muoto
~LuokkaNimi()
 Yleensä hajottimeen vapautusoperaatiot dynaamisesti
varatulle muistille jne.
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
17
*x++=*y++
V.I.3 Abstraktit tietotyypit C++:ssa (6)

C++-olioiden muistinvaraus voi olla
 Staattinen,
 Pinodynaaminen,
 Kekodynaaminen


Oliot vapautettava delete –operaattorilla
C++:ssa olio voi käyttäytyä kuten mikä tahansa
muuttuja
 Voi olla esim. globaali
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
18
*x++=*y++
V.I.4 Abstraktit tietotyypit Javassa
V.I.4.1. Javan vertailua C++:aan




Luokkamalli muistuttaa C++ -kielen mallia
Oliot aina kekodynaamisia
Ohjelmoija ei itse voi suoraan vapauttaa muistia, vaan
roskien keruu huolehtii tästä
Olion tuhoamisen yhteydessä tarpeelliset operaatiot
ylikirjoittamalla finalize() –metodi
 Kaikki oliot perivät Object –luokalta
 Harvoin tarvitsee tehdä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
19
*x++=*y++
V.I.4.1. Javan vertailua C++:aan




Oliot viitetyypin muuttujia
 Jäseniin viitataan pistenotaatiolla
Kaikkien metodien ja tietotyyppien on kuuluttava
johonkin luokkaan
Metodien määrittely toteutetaan samassa luokassa, jossa
metodi esitellään
Voidaan määritellä sekä staattisia että ei-staattisia
jäsenmuuttujia ja -metodeja
 Staattiset jäsenmuuttujat voidaan myös alustaa
luokassa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
20
*x++=*y++
V.I.4.2. Tiedon kätkentä Javassa


Samat näkyvyysmääreet (public, protected ja private)
kuin C++:ssa
 Merkityskin sama kuin C++:ssa
Lisäksi oletusnäkyvyys = pakkausnäkyvyys (package
scope)
 Jäsenet näkyvät pakkauksen sisällä
 Korvattu C++ -kielen ystäväluokat ja -funktiot, joita
Javassa ei ole toteutettu
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
21
*x++=*y++
V.II.1. Olio-ohjelmointi, Johdatus
V.II.1.1. Hieman historiaa



1980-luku: tarve ohjelmien uudelleenkäyttöön
 Abstraktit tietotyypit sopivat tarkoitukseen
Abstraktien tietotyyppien ongelmia:
 Ei yleensä sovi sellaisenaan uuteen käyttöön
 Tyypit eivät muodosta hierarkkista rakennetta
Ratkaisuksi olio-ohjelmointi
 Abstrakti tietotyyppi luokka, instanssi olio
 Luokka voidaan periä ja muokata sitä sekä lisätä
ominaisuuksia
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
22
*x++=*y++
V.II.1.2. Olioparadigma




Muutos aiempaan: tietoalkiot (oliot) ovat aktiivisia
Ohjelman toiminta koostuu olioiden toisilleen
lähettämistä viesteistä ja niihin saaduista vastauksista
Olion tila: sen jäsenmuuttujien arvot
Ihanne: toiset oliot eivät muuta tai lue suoraan olion
tilaa
 Käytetään erillisiä saanti- ja asetusmetodeja
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
23
*x++=*y++
V.II.2. Periytyvyys (inheritance)




Olio-ohjelmoinnin keskeisin käsite
Kuvaa luokkien väliset suhteet
Luokka, joka peritään = kantaluokka (base class) tai
yliluokka (superclass)
Perivä luokka = aliluokka (subclass) tai johdettu
luokka (derived class)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
24
*x++=*y++
V.II.2. Periytyvyys (2)



Kantaluokan olioiden käyttäytyminen siirtyy osaksi
aliluokan olioiden käyttäytymistä
Laajentaminen periytymisessä
 Uusien jäsenmuuttujien ja metodien lisääminen
aliluokkaan
Erikoistaminen periytymisessä
 Aliluokassa korvataan perittyjä määrittelyjä luokan
omilla määrittelyillä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
25
*x++=*y++
V.II.2.1. Alityyppi



Määritelmä: Tyypin T alityyppi on sellainen tietotyyppi
S, johon voidaan soveltaa mitä tahansa tyyppiin T
sovellettavaa operaatiota
 Tällöin tyyppi T on tyypin S ylityyppi
Tärkeä kysymys: Ovatko aliluokat kantaluokan
alityyppejä?
Alityyppiperiaate: Alityypin olio voi ohjelmassa esiintyä
missä tahansa sen ylityypin odotetaan esiintyvän.
 Pätee, jos aliluokalle sallitaan periytymisessä
ainoastaan laajentaminen ja erikoistaminen
 Ei kaikissa kielissä kaikessa periytymisessä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
26
*x++=*y++
V.II.2.2. Tiedon kätkentä


Näkyvyysmääreet säätelevät, mitkä kantaluokan
ominaisuudet ovat aliluokan käytettävissä
Usein julkisten jäsenten lisäksi vain suojatut jäsenet ovat
näkyvissä aliluokassa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
27
*x++=*y++
V.II.2.3. Moniperiytyvyys (multiple inheritance)



Luokalla voi olla monta kantaluokkaa
Luokkahierarkia muodostaa verkon
Jos ei sallita, luokkahierarkia puurakenne
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
28
*x++=*y++
V.II.2.4. Piilottaminen ja uudelleen määrittely



Aliluokassa määritellään jäsenmuuttuja, joka on
samanniminen kuin peritty -> uusi määrittely piilottaa
yliluokan muuttujan
Aliluokan metodi, jolla on sama prototyyppi (sama nimi
ja parametrit) kuin kantaluokan metodilla, määrittelee
uudelleen (override) perityn metodin
Yliluokan muuttujiin ja metodeihin voidaan yleensä
viitata yliluokan nimen ja tarkoitukseen määrätyn
operaattorin avulla
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
29
*x++=*y++
V.II.3 Monimuotoisuus ja dynaaminen sidonta

Monimuotoisuus (polymorfismi, polymorphism)
 Tässä: saman operaattorin tai funktion sitominen
erilaisiin toteutuksiin tilanteesta riippuen
 Olio-ohjelmoinnissa saavutetaan viestin
dynaamisella sidonnalla metodin määrittelyyn

Tämä mekanismi + alityyppiperiaate -> monimuotoiset
muuttujat = tyyppi on kantaluokka, mutta muuttujat voivat
olla jonkin aliluokan olioita
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
30
*x++=*y++
V.II.3 Monimuotoisuus ja dynaaminen sidonta (2)

Dynaaminen sidonta
 Helpottaa ohjelmiston ylläpitoa: Muodostettaessa
uusia luokkia, kantaluokkien koodia ei tarvitse
perustoiminnoissa muuttaa
 Tapahtuu ohjelman suorituksen aikana ->
tehottomampaa kuin staattinen sidonta -> joissakin
oliokielissä ohjelmoija voi säätää, mitkä metodit
sidotaan dynaamisesti
 Tyypintarkistus vaikeutuu, koska monimuotoinen
muuttuja voi osoittaa tietotyyppiin, joka on tietotyypin
määrittelemän tyypin alityyppi
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
31
*x++=*y++
V.II.3 Monimuotoisuus ja dynaaminen sidonta (3)

Abstrakti luokka
 Käytännöllinen, kun oliohierarkian kantaluokka niin
yleinen, ettei siitä kannata muodostaa olioita
 Ei voi luoda instansseja
 Voi sisältää abstrakteja metodeja, joille määritelty
ainoastaan prototyyppi, mutta ei lainkaan runkoa
 HUOM! Älä sekoita abstraktiin tietotyyppiin!
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
32
*x++=*y++
V.2.4 Oliokielten suunnittelukysymyksiä
1.
2.
3.
4.
Onko kielessä muita tietotyyppejä kuin olioita?
Ovatko aliluokat aina perittyjen luokkien alityyppejä?
Sallitaanko moniperiytyminen?
Miten hoidetaan olioiden muistinvaraaminen ja vapauttaminen?
5. Sidotaanko metodit aina dynaamisesti vai onko
staattinen sidonta mahdollista?
6. Sallitaanko sisäkkäisiä luokkia?
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
33
*x++=*y++
V.II.5 Olio-ohjelmointi C++:ssa
V.II.5.1. Periytyminen C++:ssa
class derived_class_name: acces_mode
base_class_name {
<data members>
<member functions>
};
 acces_mode jokin näkyvyysmääre (public, protected
tai private)
 Säätelee, miten kantaluokan jäsenet näkyvät
aliluokassa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
34
*x++=*y++
V.II.5.1. Periytyminen C++:ssa (2)



Tavallisimmin access_mode = public
 Aliluokassa näkyvät kaikki public ja protected –
tyyppiset muuttujat ja funktiot, näkyvyysmääre on
sama kuin kantaluokassa
 private –tyyppisiin jäseniin aliluokalla ei ole pääsyä
 Aliluokka on kantaluokan alityyppi
access_mode =private
access_mode = protected
 Näkyvyydet aliluokassa rajoitettuja
 Kummassakaan tapauksessa aliluokka ei ole
kantaluokan alityyppi
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
35
*x++=*y++
V.II.5.1. Periytyminen C++:ssa (3)


C++:ssa ei yhteistä kantaluokkaa
 Voidaan tehdä luokka, jolla ei lainkaan jäseniä
C++:ssa moniperiytyminen
 Luokkahierarkia verkkomainen
 Voi aiheuttaa nimitörmäyksiä
 Dynaamisen sidonnan toteuttaminen hankalampaa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
36
*x++=*y++
V.II.5.2. Dynaaminen sidonta C++:ssa


Ei automaattista
Esimerkki.
class AliLuokka:public
Kanta{
class Kanta{
public:
public:
void kanta_funktio(){
void kanta_funktio(){ cout << ”Aliluokka";
cout << "Kanta";
}
};
}
void kutsuja(
};
Kanta *k)
{
Koodi
k->kanta_funktio();
AliLuokka ali;
}
kutsuja(&ali);
tulostaa: Kanta
Siis ei dynaaminen sidonta
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
37
*x++=*y++
V.II.5.2. Dynaaminen sidonta C++:ssa (2)

Muutos edelliseen:
class Kanta{
public:
virtual void kanta_funktio()
cout << "Kanta";
}
};
 Tulostuu Aliluokka
{
 Jäsenfunktio virtuaalinen -> sidotaan dynaamisesti
 Virtuaalisuus periytyy kaikkiin aliluokkiin
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
38
*x++=*y++
V.II.5.3. Abstraktit luokat C++:ssa



Luokka abstraktiksi sisällyttämällä luokkaan vähintään
yksi puhtaasti virtuaalinen funktio (ei runkoa,
merkitään nollaksi)
Esimerkki
class Kanta{
public:
virtual void kanta_funktio() = 0;
};
-> Luokasta abstrakti, eikä siitä voi luoda oliota
Aliluokasta konkreettinen -> ylikirjoitettava puhtaasti
virtuaaliset metodit
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
39
*x++=*y++
V.II.6. Olio-ohjelmointi Javassa



Tarkastellaan eroja C++ -kieleen
Puhtaampi oliokieli kuin C++
 Ei täysin: primitiiviset tietotyypit eivät olioita
Javassa jokainen luokka perii (extends) täsmälleen
yhden luokan
 Ellei luokan ilmoiteta perivän toista luokkaa, se perii
Object-luokan
 C++ :luokan ei tarvitse periä mitään
 Javan luokkahierarkia puumainen, C++:n
verkkomainen
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
40
*x++=*y++
V.II.6.1. Rajapinnat (interfaces) Javassa




Otettu moniperiytymisen korvaajaksi
Eräänlaisia puhtaasti abstrakteja luokkia, jotka sisältävät
ainoastaan metodien esittelyt
Luokka toteuttaa (implements) rajapinnan
 Toteuttaa metodit (kaikki jos konkreeettinen luokka)
 Voi toteuttaa useita rajapintoja
Rajapinnat voivat periä toisia rajapintoja
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
41
*x++=*y++
V.II.6.2. Abstraktit luokat Javassa


Luokka erikseen määriteltävä abstraktiksi
Abstrakti luokka voi sisältää abstrakteja metodeja
Esimerkki

public abstract class MessagePasser
{
public abstract void send(Object o);
public void send(int i) {
send(new Integer(i));
}
public abstract Object receive();
public int receiveInt{
return(((Integer)this.receive()).intValue());
}
}
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
42
*x++=*y++
V.II.6.3. Periytyminen ja dynaaminen sidonta
Javassa





Periytymisen tyyppiä ei voida Javassa säätää
Periytyminen vastaa C++:n public-periytymistä
 public- ja protected-tyyppiset jäsenet aliluokassa
näkyvissä ja niiden näkyvyydet säilyvät samana
 private-tyyppiset jäsenet eivät näy aliluokassa
Aliluokka on aina kantaluokan alityyppi
Periytymisketju voidaan katkaista final-määreellä
 Luokka final -> ei voida periä
 Metodi final -> ei voida ylikirjoittaa
Javassa kaikki sidonta dynaamista, ohjelmoija ei voi
muuttaa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
43
*x++=*y++
V.II.6.4. Yhteenveto Javasta





Javan luokkamalli pohjautuu C++ -kielen malliin,
yksinkertaistettu vahvasti
Moniperiytyminen korvattu rajapintojen käytöllä
Kaikki luokat perivät yhteisen perusluokan (Object)
Kaikki sidonta on dynaamista
Periytymiseen liittyvät näkyvyysmääreet poistettu
 C++:ssa hankala järjestelmä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
44
*x++=*y++
V.II.6.4. Yhteenveto Javasta (2)



C++ -kielen ystäväjärjestelmästä luovuttu
Muutoksista C++:aan vain moniperinnän puuttumista
voidaan arvostella rajoittavan ohjelmoijan työtä
Sekä Java että C++ sallivat sisäkkäiset luokat
 Arvosteltu huonona ratkaisuna
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi
45