Metode • Kratki, enostavni programi • Kodo pišemo v glavno metodo Večji programi Nekaj 100.000 vrstic Ne moremo napisati v enem delu podprogrami, funkcije, procedure, subrutine, ... Zaporedje stavkov, ki ima svoje ime • metode Drugi programski jeziki • Razdelitev na manjše dele Vsak del kode posebej Java Ime omogoča, da to zaporedje pokličemo z različnih mest v programu Zakaj metode? "skrivanje" postopka - metodo napišemo in jo potem lahko uporabimo, ne da bi skrbeli, kako je napisana preglednost programa bostjan.vouk@tsc.si Metode • Doslej smo uporabljali že cel kup metod razredov (ang. class methods) • Metode lahko pišemo tudi sami in jih po svoje poimenujemo • main, random, valueOf, println, length, charAt, toString, equals, compareTo, endsWith, substring, … izpisTabele, izracunPovpVrednosti, urejanjeMehurcno, urejanjeZVstavljanjem, urejanjeZIzbiranjem, … Delitev kode Naučimo se predvsem s prakso Upoštevanje načel Preglednost Uporabnost v drugih programih "samozadostnost“ Ne izpisujemo ali beremo, če to ni izrecni namen metode bostjan.vouk@tsc.si Primer • Označi vse metode v spodnjem programu: class Ugibanje { public static void main(String[] argumenti){ // izvajalna koda int y= (int)(Math.random()*6+1); int a = Integer.valueOf(arg[0]); int b = Integer.valueOf(arg[1]); if ( (y>a)&&(y<b) || (y>b)&&(y<a) ) System.out.println(" y="+y+" JE v podanem intervalu ("+a+","+b+")"); else System.out.println(" y="+y+" NI v podanem intervalu ("+a+","+b+")"); } } • Vse uporabljene metode so statične narave, saj za njihovo uporabo nikjer nismo ustvarili nobenega objekta. Klic metode je v primeru izveden tako, da navedemo ime metode in ji, če je bilo potrebno, podamo tudi potrebne argumente. Vse metode, razen main, ki se kliče avtomatično ob zagonu programa, so deli obstoječih javanskih razredov, edina, ki smo jo spisali sami je razredna metoda main. bostjan.vouk@tsc.si 1 Vrste metod • Statične Objektne • Metode • • (ne)vračajo rezultat (ne)sprejmejo argumente Metode, ki ne vračajo vrednosti (procedure) Poudarek je na postopku Klic take metode je samostojen stavek • Metode, ki vračajo vrednosti (funkcije) Poudarek je na vrednosti Klic take metode je sestavni del izraza • Obravnava statičnih bostjan.vouk@tsc.si Dogovor • ime metode naj bo pomensko iz imena metode se da ugotoviti, kaj metoda počne; • • npr. izpisTabele ime metode naj se prične z malo začetnico imena se morajo ločiti od imen razredov z veliko začetnico poimenujemo razrede sestavljena imena metod naj se sestavljajo tako, da se vsaka naslednja beseda prične z veliko začetnico npr. izpisTabeleIntegerjevVObratnemVrstnemRedu bostjan.vouk@tsc.si Struktura metode • Tipično zgradbo poljubne javanske metode sestavljata dva dela: • glava metode (včasih tudi deklaracija ali najava metode) vsebuje ime metode : (main) kvalifikatorje (dostopna določila) • tip vrednosti, ki jo metoda vrne klicočemu (void) vrsto metode (static) dostopnostni atribut (public) parametre metode (String[] argumenti) telo metode (včasih tudi blok kode metode) sestavljajo programski stavki, zajeti v javanski blok, omejen s simboloma { in } bostjan.vouk@tsc.si 2 “minimalna” metoda • Deklaracija • Predstavlja “predlogo” metode, ki nič ne naredi in ničesar ne vrača klicočemu • void imeMetode (){ } telo metode ne vsebuje nobene kode void pred imenom metode Pri uporabi razrednih metod “predlogo” dopolnimo s kvalifikatorjem static static void imeMetode(){ } bostjan.vouk@tsc.si Metode v programu Splošna oblika • Primer public class MojProgram { • // tu napišemo metode, eno za drugo // ne pozabimo napisati metode main! public static void main(String[] args){ // izvajalna koda // ... } } public class MojProgram { public static int max(int a, int b) { /* vrne vecje od dveh celih stevil */ if (a > b) {return a;} else {return b;} } public static void main(String[] parametri) { // določi največje število med tremi stevili int x=8, y=16, z=67; System.out.println("Največje število je" + max(x, max(y, z))); } } bostjan.vouk@tsc.si Uporaba in izvajanje metod • • Primer uporabe lastne statične metode, ki ne naredi nič drugega kot to, da na zaslon izpiše niz "izvajam metodo .." class MojaStaticna{ static void mojaMetoda(){ System.out.println("izvajam metodo ..."); } public static void main(String[] argumenti){ System.out.println("zacetek izvajanja (glavna) ..."); mojaMetoda(); // klic razredne (statične) metode System.out.println("konec izvajanja (glavna) ..."); } } bostjan.vouk@tsc.si 3 Metoda za izpis naslova šole • Metoda za izpis naslova šole • Izpis: class NaslovTSC { public static void main(String[] args) { naslov(); } public static void naslov() { System.out.print("Tehniški šolski center "); System.out.println(" Nova Gorica "); System.out.println(); System.out.println(“Cankarjeva 10"); System.out.println(“5000 Nova Gorica"); } } bostjan.vouk@tsc.si Primer metode Primer: • Razlaga: public static int max(int a, int b) { /* vrne vecje od dveh celih stevil */ if (a > b) { return a; } else { return b; } • public Vsi deli programa lahko uporabljajo to metodo • static Statična metoda • int (za public static) Rezultat bo podatkovnega tipa int • max (int a, int b) Argumenta metode Oba sta tipa int Formalni argument • return Kakšen rezultat vrne metoda Konec izvajanja metode } x = max(12,x); … System.out.println("Vecje med stevili "+a+" in "+c+ " je "+max(a,c)); … y = max(max(a,b) + max(c,d), 2 + max(100,x * x)); Ime metode (poljubno!) • bostjan.vouk@tsc.si Naloga Navodila: • Napiši metodo inicialke, ki sprejme dva niza znakov (ime in priimek) in vrne niz sestavljen iz inicialk. • Primer: • inicialke("France", "Preseren") • String Število argumentov • inicialke Tip metode • vrne niz"F.P.". Ime metode • Rešitev: 2 Tip in imena argumentov String ime String priimek bostjan.vouk@tsc.si 4 Naloga • public static int vsota(int n) { int r = 1; • Kako je ime metodi? • • • int i = 1; while (i < n) • { • • • } return r; • množi števila od 1 do n Ali lahko predlagaš boljše ime za metodo? • } podatkovni tip: int ime argumenta: n Kaj metoda počne? • • 1 Kakšni so tipi in imena argumentov? • r = i * r; int Koliko argumentov sprejme metoda? • i = i + 1; vsota Kakšen je tip rezultata, ki ga vrača metoda? fakulteta (n!) Napiši program Demo.java, ki demonstrira delovanje metode. bostjan.vouk@tsc.si Kdaj uporabiti metodo? Primer brez metod • Primer z uporabo metod class ManipTabela1{ public static void main(String[] argumenti){ int tabela[]={1,2,3,4,5,6,7,8}; int stevec; for (stevec=0;stevec<tabela.length;stevec++) • class ManipTabela2{ static int tabela[]={1,2,3,4,5,6,7,8}; static void izpisiTabelo(){ int stevec; for (stevec=0;stevec<tabela.length;stevec++) System.out.print(tabela[i]); System.out.println(); for (stevec=0;stevec<tabela.length;stevec++) tabela[stevec]++; for (stevec=0;stevec<tabela.length;stevec++) System.out.print(tabela[i]); System.out.print(tabela[i]); System.out.println(); } static void povecajVrednostElTabele(){ int stevec; for (stevec=0;stevec<tabela.length;stevec++) System.out.println(); for (stevec=0;stevec<tabela.length;stevec++) tabela[stevec]++; for (stevec=0;stevec<tabela.length;stevec++) System.out.print(tabela[i]); System.out.println(); }} tabela[stevec]++; } public static void main(String[] argumenti){ izpisiTabelo(); povecajVrednostElTabele(); izpisiTabelo(); povecajVrednostElTabele(); izpisiTabelo(); bostjan.vouk@tsc.si }} Prednosti uporabe metod • • • Funkcionalnost izpisa in povečevanja elementov prenesemo v ločena podprograma, v glavni metodi ostane le (preglednejši) 'pseudoprogram'. Ker metodi izpisiTabelo() in povecajVrednostElTabele() ne vesta ničesar o tabeli, s katero delata, je deklaracija tabele prenesena na nivo razreda. S tem jo naredimo dostopno vseh članom razredom hkrati pa mora biti statičnega tipa, sicer iz glavne metode do tabele ne moremo dostopati. S primerom dosežemo to, da imamo kodo za en problem spisano le enkrat, ne rešimo pa splošnosti same kode. Konkreten primer zna izpisati tabelo z imenom tabela, v primeru večih tabel ali tabele z drugačnim imenom pa je potrebno kodo za vsak primer spisati posebej. Problem splošnosti pomagajo reševati parametri podprogramov. bostjan.vouk@tsc.si 5 Primer ManipTabela3 • class ManipTabela3{ static void izpisiTabelo(int[] tabela){ int stevec; for (stevec=0;stevec<tabela.length;stevec++) System.out.print(tabela[i]); System.out.println(); } public static void main(String[] argumenti){ int tab1[]={1,2,3,4,5,6,7,8}; int tab2[]={8,7,6,5,4,3,2,1}; izpisiTabelo(tab1); izpisiTabelo(tab2); } } bostjan.vouk@tsc.si Razlaga primera ManipTabela3 • • Glavna metoda vsebuje 2 tabeli (tab1 in tab2). Za njun izpis uporabimo eno samo razredno metodo izpisiTabelo(int[] tabela), kateri pri klicu povemo, katero izmed obeh tabel naj izpiše. Metoda je napisana tako, da zna izpisati poljubno tabelo, katere elementi so cela števila oz. so podatkovnega tipa int. Telo metode (koda) je samozadostno: vsi potrebni podatki za njeno izvajanje so deklarirani znotraj njene kode, tabela za izpis pa je posredovana preko parametra • Ker je metoda za izpis samozadostna, bi jo lahko izločili v ločen razred oz. v neke vrste programsko knjižnico. bostjan.vouk@tsc.si Parametri (argumenti) metod • • • Parametre metod navedemo v oklepajih za imenom same metode, lahko so poljubnega javanskega podatkovnega tipa in so med seboj ločeni z vejicami Ločimo primitivne (enostavni podatkovni tipi) referenčne (tabela), parametre Primer statične glavne metode main: public static void main(String[] argumenti) { ...} argument je tabela nizov znakov bostjan.vouk@tsc.si 6 Parametri (argumenti) metod • • Metoda lahko nastopa brez, z enim ali večimi argumenti. V primeru večih argumentov so ti ločeni z vejico. V glavi metode so argumenti vedno podani s svojim podatkovnim tipom in svojim imenom. Primeri: public static void main(String[] argumenti) static void abc(int a, int b) static void trije(int a, double b, int[] tab) en argument z imenom argumenti dva celoštevilska argumenta z imenoma a in b trije argumenti: celoštevilski a, neceloštevilski b in referenčni - tabela tab bostjan.vouk@tsc.si Metoda z dvema argumentoma • Izračun stanja po enoletni vezavi sredstev public static void poEnemLetu(double glavnica, double obrMera) { double novoStanje; novoStanje = glavnica + glavnica * obrMera/100; System.out.println ("Po enem letu dobimo " + novoStanje); } Klic metode poEnemLetu poEnemLetu (100000, 9.5); double gl = 100000.0, obr = 9.5; poEnemLetu (gl, obr); a) b) bostjan.vouk@tsc.si Formalni in dejanski argumenti • Formalni argument Za opis delovanja metode • max(int a, int b) Dejanski argument Začetna vrednost argumenta metode int y=16; klic: max(12, y) Parameter a v metodi dobi vrednost 12 Parameter b v metodi dobi vrednost, ki je shranjena v spremenljivki y bostjan.vouk@tsc.si 7 Klicanje metod • • Ob klicu metode navedemo Ime metode Dejanske parametre (v oklepaju) Formalni in dejanski parametri se morajo ujemati v • Številu Vrstnem redu (istoležni parametri se zamenjajo) Dejanski parameter je lahko: Konstanta Spremenljivka Izraz • Podatkovnem tipu Primera: max(12, 23 * 7) max(a - b, x) Pomni: Navadne spremenljivke se prenašajo po vrednosti, objekti pa po referenci. bostjan.vouk@tsc.si Prenos parametrov metodam • • static void izpisi(int parameter){ int lokalna; lokalna =33; System.out.println(vrednost+parameter); lokalna++; // povecamo vrednost lokalnega podatka parameter++; // povecamo vrednost parametra System.out.println("lokalna : "+lokalna+" parameter : "+parameter); } klic podprograma: int posredovana=10; izpisi(posredovana); • izpis: bostjan.vouk@tsc.si Prenos parametrov metodam • • Posredovane vrednosti se prenesejo parametrom v enakem vrstnem redu kot so bile posredovane s klicem. Primer: static void izpisiNajmanjsegaIzmedTreh(int prvi, int drugi, int tretji){ if ( (prvi < drugi) && (prvi<tretji) ) System.out.println("vrednost prvega parametra ("+prvi+") je najmanjsa."); else { if ( (drugi < prvi) && (drugi<tretji) ) System.out.println("vrednost drugega parametra ("+drugi+") je najmanjsa."); else System.out.println("najmanjsa ni niti vrednost prvega ("+prvi+") niti drugega parametra ("+drugi+") ."); }} Pri izvedbi kode: Izpis: int a=1, b=-2, c=4; izpisiNajmanjsegaIzmedTreh(a,b,c); • Vrednost a-ja se prenese prvemu specificiranemu parametru z imenom prvi, vrednost b-ja drugemu z imenom drugi in vrednost c-ja parametru tretji. bostjan.vouk@tsc.si 8 Prenos parametrov metodam • Klic metode izpisiNajmanjsegaIzmedTreh(int i, int j,int k); ni mogoč če ne podamo vseh treh zahtevanih parametrov int a,b; izpisiNajmanjsegaIzmedTreh(a,b); če parametri niso ustreznega tipa int a,c; int[] tab1; izpisiNajmanjsegaIzmedTreh(a,c,tab1); bostjan.vouk@tsc.si Parametri primitivnih in referenčnih tipov • • • Eno izmed pogostejših vprašanj, ki si jih programerji zastavljajo, ko uporabljajo metode (funkcije, podprograme,..) v praktično vseh programskih jezikih je Kako se prenašajo parametri metodam? Z vprašanjem je mišljeno sledeče: če metodi posredujemo podatek in podatek v telesu metode spremenimo ali se vrednost podatka s to spremembo spremeni tudi v delu programa, od koder smo klicali to metodo. Odgovor (velja za javanski programski jezik) • • DA in NE. Parametri javanskih metod so vedno preneseni po vrednosti. Če je parameter referenčnega podatkovnega tipa (objekt), ga je moč v telesu metode spremeniti, sicer ne. bostjan.vouk@tsc.si Parameter primitivnega tipa • • V primeru, da je parameter primitivnega (osnovnega) podatkovnega tipa, se pri klicu metode z deklaracijo parametra v glavi metode dejansko ustvari kopija podatka, ki se ji priredi vrednost s klicem posredovanega. Vse spremembe, ki se vršijo v telesu metode, se vršijo na tej kopiji. Ob koncu izvajanja telesa metode vsi v metodi deklarirani podatki (tudi parametri) postanejo nedosegljivi (gre za lokalne podatke). Ostane le originalni podatek v klicočem delu kode, ki pa se nikjer ni spremenil. Pravimo, da smo parameter prenesli z vrednostjo, da je prenesen parameter vrednosten ali da smo parameter prenesli po vrednosti. bostjan.vouk@tsc.si 9 Parameter referenčnega tipa • V primeru, da je parameter referenčnega podatkovnega tipa, se parameter prenese na popolnoma enak način kot parameter primitivnega podatkovnega tipa, edina razlika je, da parameter dejansko predstavlja pomnilniški naslov objekta. Tako posredovani parameter in kopija kažeta na isti objekt v pomnilniku, ki ga je na ta način (če objekt seveda to dopušča) moč spremeniti. bostjan.vouk@tsc.si Primer: prenos po vrednosti • static void testParam1(int a, int b){ int t=a; • Izpis: a=b; b=t; System.out.println(" "+a+" "+b); } .. int a = 7, b=2; System.out.println(" "+a+" "+b); testParam1(a,b); System.out.println(" "+a+" "+b); .. bostjan.vouk@tsc.si Primer: prenos po referenci • static void testParam2(int[] t){ t[0]=1; • Izpis: t[1]=1; System.out.println(" "+t[0]+t[1]+t[2]+t[3]); } .. int t[]={3,3,2,2}; System.out.println(" "+t[0]+t[1]+t[2]+t[3]); testParam2(t); System.out.println(" "+t[0]+t[1]+t[2]+t[3]); .. bostjan.vouk@tsc.si 10 Primer Kaj izpiše spodnji program? • Rešitev: public class naloga_3 { public static void main(String[] args) { int[] array = new int[20]; for(int i = 1; i <= 10; i++) { array[i - 1] = i; } dopolni(array); for(int i = 0; i < array.length; i++) { System.out.print(array[i] + ", "); } } private static void dopolni(int[] array) { for(int i = 10; i < array.length; i++) { array[i] = array[i - 10] + array[i - 9]; } } } bostjan.vouk@tsc.si Metode iz drugih razredov • Primer Datoteka: NekiProgram.java Vsebuje metodo: MetodaA public static int metodaA(int x) Datoteka: DrugiProgram.java • Klic metode: NekiProgram.metodaA(izrazTipaInt) Metode drugih programov (razredov) kličemo ImeRazreda.imeMetode(parametri) Velja za metode z določili static in public !!! bostjan.vouk@tsc.si Naloga Navodila: • Rešitev: Pri ocenjevanju skakalcev je v navadi, da se najboljša in najslabša ocena zavržeta, od preostalih števil pa se izračuna povprečje. Če je več enakih najmanjših (največjih) ocen, zavržemo le eno. V metodi skakalnoPovprecje, ki za dano tabelo realnih števil vrne povprečje njenih elementov, pri čemer naj najmanjšega in največjega števila ne upošteva, manjkajo pogoji. Predpostaviš lahko, da je dolžina tabele večja od 2. • public static double skakalnoPovprecje(double[] tabela) { int dolzina = tabela.length, i = 1; double vsota = tabela[0]; double minimum = tabela[0]; // kandidat za najmanjse double maksimum = tabela[0]; // kandidat za najvecje while (______________________) { vsota = vsota + tabela[i]; if (__________________________) minimum = tabela[i]; // novi kandidat za najmanjse if (__________________________) maksimum = tabela[i]; // novi kandidat za najvecje i = i + 1; } // ker je dolzina > 2, ni problemov z deljenjem return (vsota - minimum - maksimum) / (dolzina - 2); } bostjan.vouk@tsc.si 11 Metode, ki vračajo vrednost (Funkcije) • • Metoda lahko vrne vrednost kakršnegakoli tipa Enostavnega podatkovnega tipa Tipa razred Deklaracija metode, ki vrača vrednost • V glavi mora biti naveden podatkovni tip rezultata V telesu mora biti prisoten stavek return Stavek return Določa vrednost, ki naj jo metoda vrne Običajno zadnji stavek v metodi Splošna oblika: return <izraz> bostjan.vouk@tsc.si Vračanje vrednosti metode • Metoda je po definiciji funkcija in kot taka lahko vrne rezultat svojega izvajanja. Za vračanje vrednosti v kodi telesa metode uporabimo stavek return. • Primer: • static int vsotaParam(int a, int b){ int vsota = a+b; return vsota; } • Stavek return je vedno zadnji stavek, ki se v metodi izvede. Vsi programski stavki za tem stavkom tako postanejo odvečni, saj do njihovega izvajanja nikoli ne bo prišlo. • Če metoda vrača vrednost, je pri deklaraciji metode potrebno navesti podatkovni tip vrednosti, ki jo ta metoda vrne. Podatkovni tip vrnjene vrednosti je pri javanskih metodah lahko poljuben primitiven (enostaven) ali pa poljuben referenčni podatkovni tip (tabela). bostjan.vouk@tsc.si Primer metode, ki vrača vrednost • public static double poEnemLetu (double glavnica, double obrMera) { double novoStanje; novoStanje = glavnica + glavnica * obrMera / 100; return novoStanje; // namesto izpisa vrne vrednost } • Klic metode poEnemLetu Ns = poEnemLetu (100000, 9.5); Double gl=100000.0, obr = 9.5; System.out.print ("Novo stanje: "+ poEnemLetu (gl, obr); bostjan.vouk@tsc.si 12 Primer Kaj izpiše spodnji program? • Rešitev: public class MojProgram{ public static int kaj(int n) { int r = 1; int i = 1; while (i < n) { i = i + 1; r = i * r; } return r; } public static void main(String[] parametri) { System.out.print(kaj(5)); } } bostjan.vouk@tsc.si Primer Dana je metoda naj: • Rešitev: public static int naj(int a, int b) { if (a < b) { return a; } else { return b;} } • Kaj izpiše naslednji del programa? int[] tt = {12, 54, 5}; System.out.println("Rezultat metode naj je ", naj(tt[0], tt[1])); bostjan.vouk@tsc.si Primer Dana je metoda kaj: • public static int kaj(int a, int b){ if (a <= b) return b; return a; } • Kaj izpiše naslednji del programa? int[] tt = {12, 61, 97, 12, 34}; System.out.println("Rezultat metode kaj je " + kaj(kaj(tt[1], tt[3]), kaj(tt[tt.length-1], tt[2]))); • Rešitev: bostjan.vouk@tsc.si 13 Naloga S pomočjo metode kaj sestavi metodo kaj3, ki vrne večje od treh števil. • public static int kaj(int a, int b){ if (a <= b) return b; return a; } • Rešitev: bostjan.vouk@tsc.si Povzetek • Deklaracija metode • • static podatkovni_tip imeMetode (seznam_parametrov){ //programski stavki } Klic metode imeMetode(seznam_parametrov); podatek = imeMetode(seznam_parametrov); // metoda vrača vrednost Identifikacija metode metodo enolično določajo: ime metode, podatkovni tip število parametrov • Vračanje vrednosti metode • //metoda ne vrača vrednosti return vrednost; Prenos parametrov metodam parametri se prenesejo po vrednosti ali referenci bostjan.vouk@tsc.si Statične metode in lastnosti razredov • • V objektno-usmerjeni terminologiji funkcije znotraj razredov in objektov poimenujemo metode, o podatkih govorimo kot o lastnostih. Metode in lastnosti so lahko definirane in delujejo na nivoju razreda • • pri tem ne potrebujejo za svoje delovanje nobenega javanskega objekta Člane razreda (metode in lastnosti) prepoznamo po tem, da pred njihovo deklaracijo stoji poseben kvalifikator static: • static int sprem; • public static void main(String[] argumenti){ ... bostjan.vouk@tsc.si 14 Primer • class PrLastnostiRazredov { static double avogadrovoSt = 6,022.141.99E+23; static double plackovaKonst = 6,6261E-34; //Js static int atmTlak = 101325; //Pa public static void main(String[] argumenti){ // izvajalna koda System.out.println("Atmosferski tlak :"+atmTlak); System.out.println("Avogadrovo število :"+avogadrovoSt); System.out.println("Planckova konstanta :"+planckovaKonst); } } bostjan.vouk@tsc.si Statične metode in lastnosti razredov • Omejitev rabe statičnim (razrednih) lastnosti in metod Ker so definirane na nivoju razreda in zanje ne potrebujemo nobenega ustvarjenega objekta, lahko mešana raba razrednih in objektnih članov privede do nedelovanja programa npr.: v statični metodi uporabimo lastnost objekta, ki ga še nimamo, ... Omejitev pri rabi statičnim metod statične metode lahko naslovijo le statične lastnosti in statične metode Primer nedelujočega programa: class PrLast01 { int atmTlak = 101325; // v Pa public static void main(String[] argumenti){ System.out.println("Atmosferski tlak :"+atmTlak); } } Pomni: Lastnost atmTlak zgornjega programa se v pomnilniku ustvari takrat, ko ustvarimo objekt razreda PrLast01, saj se z rezervacijo objekta ustvari tudi prostor za ta podatek. Ker tega nikjer nismo izvedli, lastnost dejansko ne obstaja, in kot tako, je tudi ne moremo nasloviti. bostjan.vouk@tsc.si Metode in lastnosti razredov • Kje in za kaj lahko izkoristimo metode in lastnosti razredov? • • “Programske knjižnice” oz. nabor podatkov in funkcionalnosti, ki jih v nespremenjeni obliki pogosto uporabljamo v svojih programih. Primer: • • Kreirajmo “knjižnico” fizikalnih konstant. Da je ne bo potrebno vsakič znova pisati v naš zagonski razred, jo izločimo v samostojnega z imenom MojeFizikalneKonstante. class MojeFizikalneKonstante { // le lastnosti, ki predstavljajo konstante public static double U = 1,660.540.2 E+10; public static double C = 2,99792458E+8; public static double G = κ = 6,672.59E-11; } // atomska masa v kg // hitrost svetlobe v m/s // gravitacijska konstanta v m3s-2kg-1 Uporabimo „knjižnico” v lastnem programu class UpKonst{ public static void main(String[] arg){ System.out.println(MojeFizikalneKonstante.U); System.out.println(MojeFizikalneKonstante.C); System.out.println(MojeFizikalneKonstante.G); } } bostjan.vouk@tsc.si 15 Povzetek • • Razredne metode in lastnosti so definirane na nivoju samega razreda, zato jih lahko uporabimo brez objekta ustreznega tipa. Ključna za deklaracijo in prepoznavo je besedica static pred deklaracijo. • static int stevec; public static void main(String[] arg){ ...} Statične metode lahko naslavljajo le statične člane razreda ne pa tudi nestatičnih. bostjan.vouk@tsc.si Naloga • • Ugotovi, kaj je narobe v spodnjem programu in odpravi napako! public class Naloga1{ int lastnost=33; public static void main(String[] ar){ System.out.println(lastnost); } } • Rešitev: bostjan.vouk@tsc.si Veljavnosti spremenljivk • Območje veljavnosti deklaracij spremenljivk • Deklaracija spremenljivke velja • • Od mesta, kjer je bila spremenljivka deklarirana, do konca bloka, v katerem smo jo deklarirali Primer: gnezdenje blokov { int spr1 = 10; // zunanji blok … { int spr2 = 20; // notranji blok … // obstajata spr1 in spr2 int spr1 = 34; } //napaka // spr1 še vedno obstaja, spr2 ne obstaja … } bostjan.vouk@tsc.si 16 Lokalne in globalne spremenljivke • • Primer: Razred z več metodami public class Primer2 { static double spr1=2.5; // globalni spremenljivki dostopni v celem razredu static int spr2=10; public static void main (String[] args) { int spr3=1; // lokalni spremenljivki dostopni v metodi main() int spr2=25; } // obstajajo spr1=2.5, spr2=25 in spr3=1 public static void xy () { double spr4=500.0; //lokalna spremenljivka // obstajajo spr1=2.5, spr2=10 in spr4=500.0 } } bostjan.vouk@tsc.si Preobložitev metode (overloading) • Javanski programski jezik enolično identificira metodo z njenim imenom, vrsto in številom parametrov. • Primer treh različnih metod: static void metoda1(int,int,int); static void metoda1(int,char,int); static void metoda1(double,int); Principu, kjer imamo več metod, ki se razlikujejo le v parametrih, v splošnem pravimo preobložitev metode (ang. overloading). V objektni terminologiji, kjer se bolj ukvarjamo s funkcionalnostjo samih metod (oz. objektov) pa ponavadi polimorfizem (večobličnost) metod. bostjan.vouk@tsc.si Preobložitev metode (overloading) • V istem razredu javanskega programa lahko istočasno obstaja več metod z enakim imenom, ki lahko opravljajo enako ali pa različno funkcijo. Primer metode min razreda Math, kjer obstaja več tako poimenovanih metod. Metode se pri tem razlikujejo le po tipu parametrov : 2. min(int,int); min(char,char); 3. ... 1. • Uporabniku (programerju) se zdi, kot da je metoda ena sama, vendar jih je dejansko več. Java pri prevajanju samodejno uporabi tisto, ki ustreza vrsti posredovanih parametrov. 1. 2. 3. min(1,2) min( 'z','A') ... pokliče prvo pokliče drugo bostjan.vouk@tsc.si 17
© Copyright 2024