260 likes | 487 Views
Objekti, razredi, . Od kje in zakaj. Združevanje podatkov. Denimo, da pišemo program, ki bo pomagal upravljati farmo zajcev Za vsakega zajca poznamo: serijsko številko spol težo Kako doseči, da se podatki “držijo” skupaj Tabela ni ustrezna Tabela je zbirka istovrstnih podatkov
E N D
Objekti, razredi, ... Od kje in zakaj
Združevanje podatkov • Denimo, da pišemo program, ki bo pomagal upravljati farmo zajcev • Za vsakega zajca poznamo: • serijsko številko • spol • težo • Kako doseči, da se podatki “držijo” skupaj • Tabela ni ustrezna • Tabela je zbirka istovrstnih podatkov • Sestavimo razred Zajec • Opis podatkov, ki sestavljajo poljubnega zajca
Razred Zajec public class Zajec { public String serijska;public boolean spol;public double masa; } • S tem imamo napisan opis, kako je določen poljuben zajec • Načrt, kakšni so zajci • Ni to konkreten zajec • Ni metode main, dejansko se NIČ ne izvede, ... • Ni namenjeno poganjanju kot program • Hisa.java • Načrt, kako je videti hiša • Kot ga je pripravil projektant • Hisa.class • Še vedno načrt, kakšna naj bo hiša • V obliki, kot ga lahko uporabijo tisti, ki bodo po tem načrtu izdelali konkretno hišo
Uporaba razreda Zajec • Z datoteko Zajec.java imamo napisan opis, kako je določen poljuben zajec • Načrt, kakšni so zajci, v obliki za uporabo – class datoteka • Program, kjer delamo z zajci: • Potrebuje datoteko Zajec.class • Če v programu (ne v datoteki Zajec.java) potrebujemo konkretnega zajca, ga “ustvarimo” z new • new Zajec() • Ustvaril se je konkreten zajec po navodilih za razred Zajec (ta zajec ima torej tri podatke / lastnosti / komponente) • Metoda je vrnila naslov, kje ta konkretni zajec je • Zajec rjavko = new Zajec(); • V spremenljivki rjavko je naslov, kje je novo ustvarjeni zajec (objekt)
Dostop do podatkov v objektu • rjavko.spol = true; • rjavko.serijska = “BRGH_17_A”; • rjavko.masa = 3.2; public class Zajčnik { public static void main(String[] ar) { Zajec z1 = new Zajec(); z1.serijska = "1238-12-0“; z1.spol = false; z1.masa = 0.12; z1.masa = z1.masa + 0.3; System.out.println(“Zajec ima ser. št.:” + z1.serijska); } }
Razred Zajec S tipom Zajec lahko "počnemo vse", torej tudi ustvarimo tabelo spremenljivk tipa Zajec • public class FarmaZajcev { • public static void main(String[] ar) { • Zajec[] zajci = new Zajec[10]; // na farmi imamo do 10 zajcev • int i = 0; • while (i < 10) { • zajci[i] = new Zajec(); // “rodil” se je nov zajec • zajci[i].serijska = "1238-12-" + i; • zajci[i].spol = false; • zajci[i].masa = 0.12; • i++; • } • ... • } • } Zajcev (objektov) še nimamo! – imamo le tabelo, kamor jih bomo shranjevali (ozroma kamor bomo shranjevali njihove naslove) V spremenljivki zajci je naslov, ki kaže na tabelo, ki lahko vsebuje naslove 10 objektov tipa Zajec 6
Še končni pogled na naslove tabZ spol: masa: serijska: • Potem bomo malček "popustili" ;-) • Zajec[] tabZ; • Ustvarili smo spremenljivko tabZ. V spremenljivki tabZ lahko shranimo naslov tabele, v katero bomo lahko shranjevali naslove objektov tipa Zajec. Trenutno v tej spremenljivki ni nobenega naslova. • tabZ = new Zajec[200]; • Operator new je nekje ustvaril tabelo, v kateri je prostor za 200 naslovov objektov, v katerih lahko shranimo podatke o posameznem zajcu. Naslov tega prostora za tabelo smo shranili v spremenljivko tabZ. • V tem trenutku ne obstaja še noben objekt tipa Zajec. • tabZ[0] = new Zajec(); • Operator new je nekje ustvaril prostor za objekt tipa Zajec. Naslov tega objekta se je shranil v 0-to celico tabele, katere naslov je shranjen v spremenljivki tabZ. • Seveda pa bomo govorili ... V tabeli tabZ je na mestu 0 zajec ... 7
Razred – shramba podatkov • public class Ulomek { public int stevec; public int imenovalec;} • Prevedemo in dobimo Ulomek.class • Kaj sedaj? • Uporabljamo v drugih programih (razredih) • Ulomek x = new Ulomek(); • Kako “napolniti” stevec in imenovalec? • x.stevec : spremenljivka tipa int! • x.imenovalec : enako • x.stevec = 1; • x.imenovalec = x.stevec + 1;
Povzetek • Definicija razreda • public class ImeRazreda { public podatkovni_tip element1; public podatkovni_tip element2; … public podatkovni_tip elementn; } 9
Povzetek • Uporaba razreda • Če potrebujemo primerek razreda • new ImeRazreda() • Ustvari prostor in pove, kje ta prostor je • Naslov prostora shranimo v neko spremenljivko (tipa ImeRazreda), denimo mojaSpTipaImeRazreda • Dostop do prostorov za hranjenje • Operator . • imeObjekta.elementi • imeObjekta.imeKomponente • mojaSpTipaImeRazreda.starost 10
Konstruktorji • Ob tvorbi objekta bi radi nastavili začetno stanje spremenljivk • in morda opravili še kaj – o tem kasneje • Konstruktor – metoda, ki jo pokličemo ob tvorbi objekta z new • Brez tipa rezultata! • Ime kot je ime razreda • Kličemo jo skupaj z new • Klic: new Zajec();
Razred Zajec public class Zajec { public String serijska;public boolean spol;public double masa; public Zajec() {// konstruktor this.spol = true; // vsem zajcem na začetku določimo m. spol this.masa = 1.0; // in tehtajo 1kg this.serijska = “NEDOLOČENO”; } } • Zajca “ustvarimo” z new • new Zajec() • Ustvaril se je konkreten zajec po navodilih iz konstruktorja Zajec() (ta zajec ima torej tri podatke z vrednostmi, kot je predpisano v konstruktorju) • Kaj je this?
this • Kako se v metodah razreda sklicati na ta objekt (objekt, nad katerim je izvajana metoda)? • Klici: objA.metodaNeka(), objC.metodaNeka() • Kako v postopku za metodaNeka povedati, da gre • Prvič za objekt z imenom objA • drugič za objekt z imenom objC • this • Pomeni objekt, ki ga "obdelujemo" • V konstruktorju – objekt, ki ga ustvarjamo • this.spol • Lastnost/komponenta spol objekta, ki se ustvarja
this Zajec rjavko = new Zajec(); Zajec belko= new Zajec(); Pri prvem klicu se je v konstruktorju this nanašal na rjavko, pri drugem na belko. this.spol v konstruktorju je torej pomenilo prvič rjavko.spol in drugič belko.spol 14
this v ostalih metodah Kasneje – pisali bomo metode, ki se bodo uporabljale nad razredi NakSt ng = new NakSt(); NakSt g2 = new NakSt(); ng.vrniNs(1,10); Kako napisati kodo metode, da se bo vedelo, da pri metodi vrniNs mislimo na uporabo objekta ng in ne na g2? Kako se v metodah razreda sklicati na ta objekt (objekt, nad katerim je izvajana metoda)? Razred MojRazred in v njem komponenta starost. Napišimo metodo metodaNeka(), ki izpiše starost objekta, nad katerim izvajamo metodo. Klici bodo npr.: objA.metodaNeka(), objC.MetodaNeka() Kako v postopku za metodaNeka povedati, da gre Prvič za objekt z imenom objA drugič za objekt z imenom objC 15
this v ostalih metodah • Kako povedati, da naj se ob klicu objA.metodaNeka() uporabi starost objekta objA, ob klicu objC.metodaNeka() pa starost objekta objC? • System.out.println("Starost je: " + ?????.starost); • Ob prvem klicu je ????objA, ob drugem paobjC. To "zamenjavo" dosežemo z this. V metodi metodaNeka napišemo • System.out.println("Starost je: " + this.starost); • Ob prvem klicu this pomeni objA, ob drugem pa objC. 16
Konstruktorji • Če konstruktorja ne napišemo (kot ga nismo prej), ga “naredi” prevajalnik sam (a metoda ne naredi nič) • public Zajec() {} • Lahko imamo več konstruktorjev • Konstruktorjev ne moremo klicati posebej (kot ostale metode) • Le ko tvorimo objekt • new • Za vzpostavitev začetnega stanja • Enako ime kot razred • Nimajo tipa rezultata (tudi void ne!) • Ni stavka return
Več konstruktorjev Uporabniki bi poleg privzetega zajca, radi še možnost, da bi takoj, ko zajca naredijo, temu določili še serijsko številko. Radi bi torej konstruktor public Zajec(String serijskaSt) Poleg tega pa včasih na farmo dobijo tudi pošiljko samic. Torej potrebujejo še konstruktor public Zajec(boolean spol) Včasih pa so zajci "nestandardni" public Zajec(String serijskaSt, boolean spol, double teza) Potrebujemo več načinov nastavljanja začetnega stanja objekta 18
Preobteževanje Več metod z enakim imenom Je to možno? Preobteževanje Overloading Velja tudi splošno, za vse metode Metode se morajo razlikovati ne v imenu, ampak podpisu Podpis metode Podpis: ime + število in tipi parametrov! public static int nekaMetoda(double x) Podpis (poenostavljeno): nekaMetoda_double Tip rezultata (return tip) NI del podpisa! public static int nekaMetoda(double x) Tip rezultata 19
Podpisi metod • Podpis metode: • public static int nekaMetoda(double x) • Podpis: nekaMetoda_double • “interno” ime • public Zajec(String serijskaStev, boolean spol, double masa) • Podpis: Zajec_String_boolean_double • Kaj je lahko sočasno: • public static int nekaMetoda() • public static int nekaMetoda(double y) • public static int nekaMetoda(double x) • public static double nekaMetoda(double x) • public static int nekaDrugaMetoda(double y)
Preobtežene metode • Tudi “navadne” metode (ne le konstruktorji) so lahko preobtežene • Možnost, da imamo enako poimenovano metodo, ki pa sprejema parametre različnega tipa • Metoda ploscina, ki kot parameter dobi objekt iz razreda Kvadrat, Krog ali Pravokotnik • Uporaba: ploscina(bla), kjer je bla lahko objekt tipa Kvadrat, Krog ali Pravokotnik • Tri metode, z enakim imenom, a različnimi podpisi • Enostavnejša uporaba kot tri metode z različnimi imeni ali ena metoda, kjer preverimo, kakšen objekt smo dobili • Enostavneje, če dobimo še četrti tip objekta – v “glavno” kodo ni potrebno posegati – naredimo novo metodo z istim imenom (ploscina) in s parametrom katerega tip je novi objekt • Klic je še vedno ploscina(bla)!
Primeri preobteženih metod • Math.abs(x) • Uporabimo lahko na tipu double in na tipu int • Dve metodi! • Math.java
Konstruktorji razreda Zajec public Zajec(String serijskaStev) { this(); // poklicali smo konstruktor Zajec() this.serijska = serijskaStev; } • this() – klic konstruktorja Zajec() public Zajec(String serijskaStev, boolean spol, double masa) { this(serijskaStev); // poklicali smo konstruktor Zajec(serijskaStev) this.masa = masa; // popravimo maso this.spol = spol; // popravimo spol }
this • this( • Za klic konstruktorja • this() • this(<parametri>) • Uporabimo lahko le kot PRVI stavek v konstruktorju • this. • Za dostop do lastnosti • this.serijska • Če ni možnosti zamenjave, lahko izpustimo • serijska • this.spol = spol; • Obstajala je že DRUGO ime spol • Ločiti med spremenljivko spol, ki je parameter in lastnostjo objekta z imenom spol • "Prednost" ima bolj "lokalna" stvar – torej parameter • spol = spol;
Zgradba programske rešitve v Javi • Rešitev problema v Javi torej sestavlja več datotek • Osnovna datoteka z metodo main • To je tista, ki jo “podtaknemo” JVM • JVM začne izvajati to metodo main • ... Če gre za programček, pa ima kot začetek metodo init in/ali metodo paint • Datoteke z opisom v osnovni datoteki uporabljenih razredov • Načrti, kako so videti objekti določene vrste, kakšne podatke vsebujejo in kaj znajo • Tudi v teh opisih razredov lahko uporabljamo druge razrede
Zgradba programske rešitve v Javi • Ko v drugi datoteki (drugi .java datoteki) uporabljamo objekt nekega razreda • Ga moramo ustvariti (new) • Dostopamo do njegovih stanj (komponent) • ime_objekta.ime_stanja • Sestavi program, ki ustvari farmo zajcev (tabelo 10 zajcev) in med njimi poišče najtežjega • FarmaZajcev.java • V njej pa bodo izrazi oblike new Zajec() ... • Zajec.class • Da bo new Zajec() in podobno delalo!