Naredimo razred Katera so stanja/lastnosti Kaj hočemo o objektih te vrste vedeti Kakšne lastnosti imajo Katere so metode Kakšno je znanje objektov Na katere ukaze se odzovejo Način predstavitve lastnosti objekta (podatke o objektu) skrijemo private enkapsulacija Okostje razreda public class Razred { // deklaracija lastnosti - komponent - polj -... // konstruktorji // metode // tostring Razredi in objekti Sestavimo razred Kovanec, s katerim predstavimo kovance. Denimo, da so kovanci okrogli, z danim polmerom in višino. Poleg konstruktorjev in standardnih metod, ki nastavijo in vrnejo vrednosti lastnosti in za pretvorbo v niz, naj razred pozna še metodi, ki vrneta površino in volumen kovanca. 1
Kovanec public class Kovanec { private int polmer; private int visina; // konstruktorji public Kovanec() { public Kovanec(int r, int v) { // "SET" metode public void nastavipolmer(int r) { public void nastavivisino(int visina) { le navedba metod // "GET" metode public int povejpolmer() { public int povejvisino() { // tostring public String tostring() { // kako je objekt videti kot niz // "znanje" public double volumen() { public double povrsina() { Kovanec public class Kovanec { private int polmer; private int visina; // konstruktorji // metode public void nastavipolmer(int r) { polmer = r; le skica public void nastavivisino(int visina) { zares: Kovanec.java // smiselna visina je le med 1 in 100 // drugace jo pustimo pri miru if ((visina <= 100) && (visina >= 1)) this.visina = visina; public int povejpolmer() { return polmer; public int povejvisino() { return visina; public String to String() { return r = + this.povejpolmer() + \nvisina = + this.povejvisino(); Uporaba Državna kovnica te najame, da napišeš program, ki reši naslednji problem Ali lahko iz bakrenega kvadra velikosti 20 x 12 x 30 naredimo n "običajnih" kovancev? interpretacija odgovorov (DA/NE) ne: nikakor to ne gre da: mogoče, ni pa nujno new Kovanec() ustvari nov, običajni kovanec. 2
Kovanci public static Drzava { public static void main(string[] a) { int kvader_x = 20; int kvader_y = 12; int kvader_z = 30; int volumenkvadra = kvader_x * kvader_y * kvader_z; int n = Integer.parseInt(a[0]); Kovanec en = new Kovanec(); int volkovanca = en.volumen(); if (volumenkvadra > n * volkovanca) System.out.println( DA ); else System.out.println( NE ); Uporaba Državni zakladnik spremeni dimenzije "običajnih" kovancev. Je potrebno spremeniti tvoj program? Kje so potrebne spremembe? Razred Kvader Geometrijsko telo Podatki Komponente opisujejo stanje objekta Metode Konstruktorji (posebne metode) Kaj se zgodi ob new znanje objektov tega razreda volumen, površina,... Metode za ravnanje s podatki Nastavi podatek Vrni podatek tostring Komponente : stranice Metode: konstruktorji volumen povrsina stranicaa stranicab stranicac kolikoa 3
Kvader - podatki Podatki: Stranice: a, b, c Odločitev o načinu predstavitve Kako bo imel objekt predstavljene stranice Ena od možnosti: 3x spremenljivka tipa int Druga možnost Tabela s tremi polji Tretja možnost:. private int a; // stranica a Zakaj enkapsulacija? Način predstavitve uporabnika NE zanima s private mu preprečimo dostop Kako potem do podatkov: Pripravimo ustrezne metode Če se podpisi metod ne spreminjajo ni težav s spreminjanjem razreda Vsi programi, ki uporabljajo objekte določenega razreda, si podatke izmenjujejo le preko metod Če se klic ne bo spremenil, je vseeno, kako je spremenjen razred! Kvader metode za delo s podatki Za podatke za katere je smiselno, da jih uporabnik vidi: Metode, ki povejo vrednost podatka poveja(), Za podatke za katere je smiselno, da jih uporabnik spremeni: Metode, ki spremenijo vrednost podatka Možnost kontrole stranicaa(), 4
Kvader - konstruktorji Standardno konstruktor brez parametrov Naredi privzeti objekt Denimo kvader s stranicami 1 x 1 x 1 public Kvader(){ a = 1; b = 1; c = 1; Kaj pa, če bi uporabniku radi ponudili več možnosti začetnega kvadra? Kvader.java Kvader.java (oglejmo si komentarje!) Konstruktor, ki naredi kocko Konstruktor, kjer podamo stranice Konstruktor, ki naredi kopijo objekta 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)! 5
Primeri preobteženih metod Math.abs(x) Uporabimo lahko na tipu double in na tipu int Dve metodi! Math.java tostring Metoda, ki se uporabi avtomatično, če moramo objekt spremeniti v niz Vedno obstaja (dedovanje), a verjetno nekoristna Zato običajno sestavljamo sami public String tostring() { return Kovanec# r: + polmer + h: + visina); Ustvarjanje razredov: povzetek Konkretni objekt je primerek nekega razreda Nastane z new Izjema: String Ni izjema, le drugačen zapis! Podobno tabele z inicializacijo Posamične lastnosti objekta Dostop: private Uporabnika ne zanima način hranjenja lastnosti objekta Metode za delo s podatki/lastnosti vrnipodatek, nastavipodatek Konstruktorji Kaj se zgodi ob kreaciji novega podatka 6
Povzetek Komponente (lastnosti) imajo dostop private konstruktorji metode, s katerimi nastavljamo vrednost (set) preverjanje pravilnosti (stanje objekta mora biti ves čas pravilno) pozor pri konstruktorjih metode, s katerimi vračamo vrednost (get) tostring ostale metode Ustvarjanje razredov: povzetek tostring Da objekt pretvorimo v niz Za predstavitev objekta Metode Namenjene uporabnikom: public interne (pomožne) metode: private Več metod z enakim imenom Preobteževanje (overloading) 7