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