14 paskaita. 2009 05 19 Kartojimas
14 paskaita. 2009 05 19 Kartojimas
14 paskaita. 2009 05 19 Kartojimas
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Kartojimas</strong><br />
Lekt. dr. Pijus Kasparaitis<br />
pkasparaitis@yahoo.com<br />
2008-<strong>2009</strong> m. m. pavasario semestras
Objektai Java kalboje<br />
Objektai turi tapatybę, būseną ir elgseną<br />
Java kalboje objekto tapatybė realizuojama<br />
nuorodomis, būsena - klasės kintamaisiais, o<br />
elgsena - metodais.<br />
Objektas yra atitinkamos klasės (angl. class)<br />
pavyzdys (angl. instance). O klasė dažnai<br />
vadinama abstrakčiu duomenų tipu (ADT).<br />
Klasė nusako bendras visų klasės objektų<br />
savybes.<br />
Kiekvienas objektas gali turėti skirtingą<br />
būseną.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 2
Programos elementai<br />
Klasės aprašymas saugomas faile, kurio<br />
vardas sutampa su klasės vardu.<br />
Klasės struktūroje yra<br />
kintamieji,<br />
konstruktorius(-iai),<br />
metodai,<br />
pagrindinis metodas (jei tai pagrindinė klasė).<br />
Programa vykdoma pagrindiniame<br />
metode main:<br />
public static void main (String [ ] args) {<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 3
Duomenys<br />
Duomenys saugomi kintamuosiuose<br />
Duomenys gali būti dviejų tipų<br />
Objektiniai<br />
Primityvieji<br />
Objektinio tipo kintamajame<br />
saugoma nuoroda į objektą<br />
Primityvaus tipo kintamajame<br />
saugoma reikšmė<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 4
Primityvūs duomenų tipai<br />
Primityvūs duomenų tipai dar<br />
vadinami įdiegtais (angl. built-in)<br />
tipais.<br />
Tipų dydžiai yra fiksuoti visoms<br />
platformoms.<br />
Primityvieji tipai<br />
boolean {true, false}<br />
byte, short, int, long<br />
float, double<br />
char<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 5
Kintamųjų deklaravimas<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Deklaravimas - tai naujo kintamojo vardo įvedimas<br />
programoje.<br />
Visi kintamieji turi buti deklaruoti.<br />
Inicializavimas - tai pradinės reikšmės suteikimas<br />
kintamajam.<br />
Bendra deklaravimo forma:<br />
tipas kintamasis1, kintamasis2;<br />
tipas kintamasis1 = reikšmė1,<br />
kintamasis2 = reikšmė2;<br />
Primityvaus tipo kintamieji inicijuojami su reikšmėmis<br />
pagal nutylėjimą (default values).<br />
Objektinio tipo kintamieji inicijuojami su null reikšme.<br />
Konstantos deklaruojamos papildomai naudojant<br />
raktinius žodžius static final.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 6
Primityvių tipų objektiniai apvalkalai<br />
Kiekvienam primityviam tipui egzistuoja<br />
objektinis tipas (angl. Wrapper).<br />
Primityvių ir objektinių tipų atitinkamybė<br />
boolean Boolean<br />
char Character 16 bitų<br />
byte Byte 8 bitai<br />
short Short 16 bitų<br />
int Integer 32 bitai<br />
long Long 64 bitai<br />
float Float 32 bitai<br />
double Double 64 bitai<br />
char simbolis ='a';<br />
Character C = new Character('a');<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 7
Masyvas - sudėtinis duomenų tipas<br />
Masyvas yra indeksuota to paties tipo<br />
reikšmių seka.<br />
Pavyzdys: boolean[] mas = new<br />
boolean[SKAICIUS];<br />
Elementai indeksuojami sveikais skaičiais<br />
nuo 0 iki SKAICIUS-1<br />
Jei vienas masyvas priskiriamas kitam, iš<br />
tikrųjų kopijuojama nuoroda į masyvą<br />
Deklaruojant masyvą, galima priskirti<br />
elementų reikšmes:<br />
pvz., int[] mas = {{2,2},{3,3}}.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 8
String tipas<br />
Java kalboje eilutės yra String tipo objektai.<br />
Eilutės nurodomos tarp dvigubų kabučių.<br />
Eilutės kuriamos<br />
<br />
<br />
arba kaip primityvūs tipai tiesiogiai<br />
String s = "az09";<br />
arba kaip objektai konstruktoriumi<br />
String t = new String("az09");<br />
Eilutėje saugomus skaičius galima paversti<br />
skaitine reikšme naudojant atitinkamus<br />
statinius apvalkalinių klasių metodus, pvz.,<br />
String g="32";<br />
int m = Integer.parseInt(g);<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 9
Lyginimai<br />
Primityviems tipams == lygina reikšmes.<br />
Objektiniams tipams galima lyginti reikšmes, o<br />
galima lyginti nuorodas į objektus.<br />
Išraiška == skirta nuorodoms tikrinti, o<br />
metodas equals skirtas lyginti turiniui. Šį<br />
metodą galima perrašyti savaip.<br />
Naujoms klasėms pagal nutylėjimą<br />
egzistuojantis equals metodas ekvivalentus<br />
==.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 10
Objektinio tipo kintamieji<br />
Neinicializuoti, be priskirtų reikšmių<br />
objektinio tipo kintamieji turi reikšmę<br />
null.<br />
Galima nustatyti, ar objektas be<br />
priskirtos reikšmės, t. y. a == null<br />
Galima objektui panaikinti priskirtą<br />
reikšmę, t. y. a = null<br />
Daug kintamųjų gali rodyti į tą patį<br />
objektą.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 11
Tipų konvertavimas<br />
Java kalboje naudojamas tipų<br />
konvertavimas (angl. casting).<br />
Kur logiška, kintamojo tipas bus<br />
konvertuotas automatiškai. Pvz.,<br />
slankaus tipo kintamajam priskyrus<br />
sveikąją reikšmę, ji bus automatiškai<br />
paversta į slankaus kablelio formatą.<br />
Konvertavimą galima/reikia nurodyti<br />
ir programoje, tam prieš išraišką<br />
skliausteliuose tereikia nurodyti tipą.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 12
Komandos<br />
Priskyrimas<br />
Metodo iškvietimas<br />
Kontrolės struktūros:<br />
nuosekli žingsnis po žingsnio<br />
šakojimo išrinkimo, pvz. if-else, switch,<br />
break, continue<br />
ciklo iteratyvi, pvz. while, for<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 13
Metodai<br />
<br />
<br />
<br />
<br />
Visos funkcijos ir procedūros yra metodai Java<br />
kalboje. Metodai dažnai skaito arba keičia klasės<br />
objekto būseną.<br />
Metodo deklaracijoje yra:<br />
grąžinama reikšmė (void, int, float, ..., objektiniai tipai)<br />
metodo vardas (žodžiai, kurie prasideda raide)<br />
formalūs parametrai (tipas ir vardas kiekvienam)<br />
Taigi bendras metodo formatas:<br />
GrąžinamasTipas metodoVardas(/*formalūs<br />
parametrai*/){return GrąžTipoKint;}<br />
Reikšmės grąžinimui metodo bloke naudojamas<br />
raktinis žodis return. Galimi keli išėjimai iš metodo<br />
realizuoti keliais return sakiniais<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> <strong>14</strong>
Parametrų perdavimas metodams<br />
Primityviųjų tipų parametrai perduodami<br />
pagal reikšmę, t. y. reikšmė<br />
nukopijuojama į atitinkamą kintamąjį.<br />
Perduodant objektus nukopijuojama<br />
nuoroda į objektą, bet ne pats objektas,<br />
taip objektą galima modifikuoti prieinant<br />
per nuorodą.<br />
Tikrieji (angl. actual) parametrai<br />
naudojami kviečiant metodus, formalieji<br />
(angl. formal) naudojami metodo viduje.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 15
Metodų perkrovimas<br />
Metodai gali buti perkraunami<br />
(angl. overloaded), t.y. kuriami keli<br />
metodai su<br />
tuo pačiu vardu,<br />
tuo pačiu grąžinamu tipu,<br />
bet skirtingų tipų įvesties parametrais.<br />
Java metodai atskiriami pagal vardą<br />
ir įvesties parametrus.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 16
Java klasės savybės<br />
Java klasė apgaubia (angl.<br />
encapsulates) aibę savybių (metodų ir<br />
kintamųjų).<br />
Kai kurios savybės yra paslėptos.<br />
Kitos savybės yra klasės sąsaja (angl.<br />
interface).<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 17
Objekto tipas ir sąsaja<br />
Kiekvienas objektas turi tipą ir sąsają<br />
(angl. interface). Pvz., Aibe yra tipas,<br />
o metodas iterpti() - sąsaja<br />
Objektas kuriamas naudojant<br />
konstruktorių, t. y. metodą su tipo<br />
vardu, pvz. Aibe a = new Aibe();<br />
Manipuliavimas objektais vykdomas<br />
kviečiant sąsajos metodus, pvz.<br />
a.iterpti(5);<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 18
Konstruktoriai<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Konstruktorius yra specialus metodas, kuriame<br />
inicializuojami naujai kuriamo objekto laukai.<br />
Klasė privalo turėti konstruktorių. Pagal nutylėjimą<br />
egzistuoja konstruktorius be parametrų.<br />
Konstruktoriaus vardas sutampa su klasės vardu.<br />
Konstruktorius nieko negrąžina.<br />
Konstruktorius gali buti perrašomas (angl. overloaded).<br />
Konstruktorius gali kviesti kitus metodus (bet ne<br />
atvirkščiai!)<br />
Konstruktorius gali kviesti kitus konstruktorius,<br />
panaudodamas this.<br />
Jei klasėje aprašytas konstruktorius ir jis turi<br />
parametrus, tada neegzistuoja konstruktorius be<br />
parametru.<br />
Klasėje galima aprašyti ir konstruktorių be parametrų.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> <strong>19</strong>
Naujo objekto kūrimas<br />
Dinaminis vietos išskyrimas (angl.<br />
instantiation). Vieta išskiriama<br />
tuščiam objektui, naudojant<br />
konstrukciją new.<br />
Objekto pirminių reikšmių priskyrimas<br />
(angl. initialization). Laukams<br />
priskiriamos reikšmės. Tai atliekama<br />
konstruktoriuose.<br />
Objektą galima kopijuoti - klonuoti<br />
(angl. cloning), kviečiant metodą<br />
clone.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 20
Objekto naikinimas<br />
<br />
<br />
<br />
<br />
<br />
Java turi šiukšlių surinkėją (angl. garbage collector),<br />
kuris naikina objektus, kai jie nereikalingi.<br />
Galima kviesti specialiai surinkimą metodu System.gc();<br />
Specialus metodas finalize kviečiamas prieš pat<br />
sunaikinimą. Savybės:<br />
neturi parametrų ir nieko negrąžina, (void)<br />
galima jį perrašyti,<br />
galima naudoti, pvz, atidarytiems failams<br />
uždaryti.<br />
Nėra garantijų, kad finalize bus kada nors iškviestas<br />
(jei užteks atminties)<br />
Šiukšlių surinkėjas tik valo atmintį. Jis neuždaro atidarytų<br />
failų, užmegztų ryšių su duomenų baze ir pan..<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 21
Statiniai ir dinaminiai<br />
kintamieji/metodai<br />
Dinaminis kintamasis (klasės kintamasis) yra<br />
duomenų deklaravimas klasėje. Kiekvienas<br />
klasės objektas turi savo dinaminio kintamojo<br />
versiją.<br />
Statinis kintamasis yra bendras visiems klasės<br />
objektams.<br />
Statinius metodus galima pasiekti nekuriant<br />
objektų, todėl jie negali prieiti prie dinaminių<br />
klasės kintamųjų.<br />
Tik klasės kintamieji yra dinaminiai arba<br />
statiniai. Kitų (metodo) kintamųjų neskirstome.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 22
Java paketai<br />
Objektinė paradigma leidžia atskirti<br />
besikeičiančius dalykus nuo dalykų, kurie<br />
nekinta - lieka tokie patys.<br />
Tokia savybė Java kalboje realizuojama<br />
naudojant Java paketus.<br />
Java paketai (angl. packages) - tai<br />
programų bibliotekos, kurias galima naudoti<br />
kitose programose.<br />
Dalis Java paketų yra standartinės Java<br />
bibliotekos, o dalis yra programuotojų<br />
sukurtos bibliotekos.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 23
Nauji Java paketai<br />
Pagal nutylėjimą, nenurodžius paketo<br />
vardo, klasės priklauso paketui be vardo,<br />
tiesiog dabartiniam katalogui.<br />
Kiekvienas paketas yra klasių rinkinys.<br />
Kuriant paketo klases pirmoje eilutėje reikia<br />
nurodyti paketą,<br />
pvz., package naujasRinkinys;<br />
Paketas realizuojamas hierarchiškai,<br />
panaudojant failinę sistemą.<br />
Paketas atitinka katalogą (ir pakatalogius).<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 24
Java paketo panaudojimas I<br />
Jei klasė yra pakete, tai ji pasiekiama<br />
nurodant kelią paketo hierarchijoje atskiriant<br />
taškais, pvz. zmones.finansai.Apskaita<br />
Vengiant pilnų kelių rodymo daug kartų,<br />
galima naudoti import sakinį ir nurodyti,<br />
iš kur klasę importuoti, pvz.,<br />
import zmones.Asmuo;<br />
Jei iš paketo naudojamos kelios klases,<br />
galima naudoti * vietoj klasės vardo ir vietoj<br />
kelių import sakinių naudoti vieną, pvz.<br />
import zmones.*;<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 25
Java paketo panaudojimas II<br />
Jei yra dvi klasės vienodais vardais iš<br />
skirtingų paketų, reikia naudoti pilną klasės<br />
vardą su paketais<br />
Java standartinis paketas java.lang visada<br />
importuojamas pagal nutylėjimą.<br />
Sisteminis kintamasis CLASSPATH nurodo<br />
kelią iki paketų, kuriuose yra reikalingos<br />
klasės. Kelią galima nurodyti ir kompiliavimo<br />
bei paleidimo metu -classpath c:....<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 26
Paketo informacijos prieinamumas<br />
Sąsajos (angl. interface) atskyrimas<br />
nuo realizacijos.<br />
Klasės naudotojui prieinama dalis.<br />
Patartinos taisyklės:<br />
duomenys (kintamieji) turėtų būti<br />
privatūs (angl. information hiding);<br />
bent vienas konstruktorius turėtų būti<br />
viešas;<br />
dalis metodų turi būti vieši<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 27
Prieinamumo tipai<br />
Private - metodas arba kintamasis<br />
prieinamas tik klasės viduje.<br />
"Draugiškas" (angl. package access) -<br />
paketo prieinamumo, viešas pakete, bet<br />
privatus išorinėms klasėms. Raktinio žodžio<br />
neturi.<br />
Protected - metodas arba kintamasis<br />
prieinamas klasėje, vaikinėje klasėje bei<br />
visose klasėse tame pačiame pakete.<br />
Public - metodas arba kintamasis<br />
prieinamas visoms klasėms.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 28
Prieinamumas klasei<br />
Private Java kalboje nėra. Veikia tik<br />
vidinėms klasėms.<br />
Protected Java kalboje nėra.<br />
Public - klasė matoma ir kitiems<br />
paketams. Viename faile - viena vieša<br />
klasė.<br />
"Paketo" - klasė prieinama paketo<br />
ribose.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 29
Paveldimumas<br />
Naujus objektus galima gauti apjungiant<br />
turimus (agreguojant).<br />
Objektinėje paradigmoje naudojama<br />
paveldimumo (angl. inheritance) sąvoka.<br />
Paveldimumas leidžia sukurti naują klasę<br />
panaudojant ankstesnės klasės savybes.<br />
Tėvinės klasės savybės būdingos ir vaikinei<br />
klasei.<br />
Pridedamos naujos savybės.<br />
Naudojant paveldimumo savybes<br />
išvengiama kodo kartojimo.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 30
Konstruktoriai ir paveldimumas<br />
Konstruktoriai nėra paveldimi.<br />
Tėvinės klasės kintamieji turi buti inicijuoti<br />
vaikinėje klasėje.<br />
Galima kviesti tėvinės klasės konstruktorių<br />
iš vaikinės klasės konstruktoriaus.<br />
Kuriant vaikinių klasių objektus, yra tokia<br />
veiksmų seka:<br />
Išskiriama vieta.<br />
Statiniai kintamieji inicializuojami pradžioje<br />
tėvinėse klasėse, paskui vaikinėse.<br />
Konstruktorius kviečiamas pradžioje<br />
tėvinėms klasėms, paskui vaikinėms.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 31
Konstruktoriai<br />
Tėvinės klasės konstruktorius kviečiamas su<br />
super() nurodant parametrus.<br />
Kuriant objektus, pradžioje kviečiamas<br />
tėvinės klasės konstruktorius, o tik tada<br />
vaikinės klasės konstruktorius. Taip būna<br />
net tada, jei programoje neparašyta, kad<br />
reikia kviesti tėvinės klasės konstruktorių.<br />
Kviečiant tėvinės klasės konstruktorių,<br />
negali būti jokio kito žingsnio vaikinės<br />
klasės konstruktoriuje prieš šį žingsnį.<br />
Tos pačios klasės konstruktorius kviečiamas<br />
panaudojant this.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 32
Perrašomi metodai ir kintamieji<br />
Metodo perrašymas (angl. overriding) - tai<br />
metodo kūno (angl. body) perrašymas<br />
vaikinėje klasėje.<br />
Perrašyti metodai ir kintamieji turi tokį pat<br />
aprašymą kaip tėvinėje klasėje.<br />
Vaikinėje klasėje abi versijos yra<br />
pasiekiamos.<br />
Prie tėvinės klasės kintamojo arba metodo<br />
galima prieiti panaudojant super.<br />
Perrašant metodus, jų priėjimo teisių<br />
negalima sumažinti.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 33
Raktas final<br />
Raktas final prie kintamojo reiškia,<br />
kad kintamojo reikšmė nekis -<br />
galutinė.<br />
Raktų pora static final rodo, kad tai<br />
konstanta visiems klasės objektams.<br />
Jei metodas yra final, jo negalima<br />
perrašyti paveldėtose klasėse.<br />
Privatūs metodai ir taip yra final net<br />
nerašant raktinio žodžio.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 34
Klasių hierarchija<br />
Visos klasės paveldi klasės<br />
java.lang.Object savybes.<br />
Jei nėra nurodyta tėvinė klasė, tai<br />
pagal nutylėjimą paveldės Object<br />
savybes.<br />
Jei kokia nors tėvinė klasė nurodyta,<br />
tada paveldės Object savybes per<br />
tėvinę klasę.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 35
Polimorfizmas<br />
Polimorfizmas -galimybė turėti skirtingas<br />
elgsenas skirtingose situacijose naudojant<br />
tipus.<br />
Polimorfizmas dar vadinamas dinaminiu<br />
surišimu (angl. dynamic binding).<br />
Kiekvienas objektas gali būti naudojamas<br />
kaip savo tipo objektas arba kaip tėvinės<br />
klasės objektas.<br />
Upcast ir downcast yra dvi priešingos<br />
savybės, kurios parodo, kaip keičiamas<br />
objekto tipas.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 36
Upcast ir Downcast savybių<br />
privalumai ir trūkumai<br />
Privalumai<br />
<br />
<br />
<br />
Programinis kodas lengvai rašomas ir skaitomas.<br />
Klasės sąsaja vienoda, tipų specifika svarbi<br />
realizacijoje. Neįtakojamos klasės - naudotojos.<br />
Naudojama daug kur, net standartinėse Java<br />
klasėse, pvz. upcast į Object tipą.<br />
Trūkumai<br />
<br />
Jei reikia vaikinės klasės savybių, klasėsenaudotojose<br />
reikia būtinai panaudoti downcast<br />
savybę.<br />
Figura a = new Kvadratas();<br />
Kvadratas b = (Kvadratas)a;<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 37
Statinis ir dinaminis tipas<br />
Statinis tipas yra deklaruojamas<br />
tipas:<br />
Pvz., K1 a;<br />
Dinaminis tipas yra tipas, su kuriuo<br />
kintamasis siejamas.<br />
Pvz., a = new K2();<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 38
Tipų tikrinimas<br />
Polimorfizmas leidžia kintamiesiems<br />
skirtingu metu rodyti į skirtingų tipų<br />
objektus.<br />
Pvz., K1 a = new K1();<br />
K2 b = new K2();<br />
a = b;<br />
Priskyrimas a=b yra įmanomas, jei statinis<br />
b tipas yra K1 arba K1 vaikinė klasė (angl.<br />
subclass).<br />
Tai statinio tipo tikrinimas, kuris atliekamas<br />
kompiliavimo metu.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 39
Metodo surišimas<br />
Metodo kvietimo susiejimas su metodo<br />
realizacija (angl. body) yra vadinamas<br />
surišimu (angl. binding).<br />
Dinaminis surišimas (angl. dynamic<br />
binding) vyksta, kai dinaminis tipas nurodo,<br />
kuris metodas kviečiamas.<br />
Statinis surišimas (angl. static binding)<br />
vyksta, kai statinis tipas nurodo, kuris<br />
metodas kviečiamas.<br />
Java naudoja dinaminį surišimą, išskyrus<br />
atvejus, kai metodai yra static arba final (o<br />
privatūs metodai ir taip visada yra final)<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 40
Abstrakti klasė<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Abstrakti klasė (angl. abstract class) parūpina bendrą<br />
sąsają klasėms, kurios paveldi abstrakčios klasės<br />
savybes.<br />
Abstrakti klasė turi bent vieną abstraktų metodą.<br />
Abstraktus metodas bei klasė žymimi raktiniu žodžiu<br />
abstract.<br />
Abstraktus metodas turi deklaraciją, bet neturi<br />
realizacijos.<br />
Abstrakčios klasės objektai nekuriami - kompiliatorius<br />
neleis šito daryti.<br />
Abstraktūs metodai realizuojami vaikinėse klasėse.<br />
Abstrakti klasė taip pat gali būti vaikine abstrakčios<br />
klasės klase.<br />
Abstrakti klasė gali turėti konstruktorius.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 41
Interface klasė<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Abstrakti klasė leidžia turėti abstrakčius metodus, kurie<br />
neturi konkrečios realizacijos.<br />
Interface klasė yra visiškai abstrakti klasė, t. y. visi<br />
metodai yra abstraktūs (pagal nutylėjimą!).<br />
Interface klasė įgalina daugybinį paveldimumą (angl.<br />
multiple inheritance).<br />
Interface klasė gali turėti laukus (kintamuosius), bet jie<br />
yra pagal nutylėjimą static ir final.<br />
Interface klasė deklaruojama žodžiu interface, nerašant<br />
žodžio class(!).<br />
Vaikinė interface klasės klasė turi naudoti raktinį žodį<br />
implements ir realizuoja atitinkamus metodus.<br />
Pagal nutylėjimą interface klasės metodai yra public,<br />
todėl jų realizacijos irgi public.<br />
Interface klasė gali būti ir interface klasės vaikinė klasė.<br />
Interface neturi konstruktorių.<br />
<strong>2009</strong>.<strong>05</strong>.13 P.Kasparaitis. Objektinis programavimas. <strong>Kartojimas</strong> 42