Metode Metode Primer - Šolski center Nova Gorica

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