Metode
Vsi programi, ki smo jih napisali do sedaj, so precej preprosti
in kratki. Pravi programi pa so običajno precej večji (na
primer, glavni del operacijskega sistema Linux sestoji iz približno 1.6
miljona vrstic), zato jih ni moremo kar napisati od začetka do
konca v metodi
main
, kot smo programe pisali do sedaj.
Večje programe razdelimo v manjše kose in nato
obravnavamo vsak kos posebej. V Javi, in v mnogih ostalih
programskih jezikih, se v ta namen uporabljajo
metode, ki jim rečemo tudi funkcije,
procedure ali podprogrami.
Pomeben del pisanja programa je odločitev, kako ga bomo
razdelili na posamezne metode. Kot vseh drugih veščin v
programiranju, se tudi te naučimo predvsem s prakso. Veljajo pa
nekatera splošna načela za pisanje metod:
- Program razdelimo na metode tako, da je bolj pregleden.
- Metode pišemo tako, da jih lahko kasneje znova uporabimo v kakem drugem programu.
- Na kakšne metode bo program razdeljen, se odločimo, ko začnemo program pisati.
- Med pisanjem programa se pogosto izkaže, da smo kako metodo slabo načrtovali, ali pa da potrebujemo metodo, ki je sploh nismo nameravali napisati. V takem primeru pisanje metod seveda prilagodimo novim potrebam.
- Pogosto se zgodi, da med pisanjem programa napravimo pravo zmedo (na primer napišemo metode, ki jih ne potrebujemo, metode neustrezno poimenujemo, pustimo komentarje, ki se ne skladajo s tem, kar program zares počne). Ko je program napisan, ga še enkrat pregledamo in premislimo, ali se ga da bolje organizirati. Morebitne izboljšave se vedno izplača narediti, ker bo tako program v bodoče lažje popravljati.
V Javi obstajata dve vrsti metod, statične metode
in objektne metode. V tem semestru bomo pisali
predvsem statične metode, objektne metode pa bomo podrobno
spoznali, ko se bomo več naučili o objektih. Osnovni pojmi v
zvezi z metodami so deklaracija,
definicija in klic metode.
Deklaracija
Z deklaracijo podamo osnovne podatke o metodi:
- določila: statična ali objektna, javna ali privatna metoda
- ime: velja dogovor, da se imena metod začnejo z malo črko (Java bo sicer sprejela tudi imena, ki se začnejo z veliko črko).
- tip rezultata, ki ga metoda vrača (če metoda ne vrača rezultata, navedemo tip
void
). - imena in tipi argumentov, ki jih metoda sprejme.
Primer:
Metoda
Metoda
public static void main(String[] args) |
main
je javna (public
), statična
(static
), ne vrača rezultata (tip void
) in
sprejme en argument tipa String[]
. Oglejmo si še en
primer:
private int size() |
size
je privatna (private
), objektna
(ker ne piše static
), vrača rezultat tipa int
,
in ne sprejme nobenih argumentov.
Definicija
Definicija metode je programska koda, ki se imenuje tudi
telo metode in se izvede vsakič, ko metodo pokličemo.
Definicijo zapišemo v blok takoj za deklaracijo:
Ta metoda je javna, statična, vrne rezultat tipa
public static int f(int k, double x) { // tukaj napisemo telo metode, // ki se izvede, ko metodo pokličemo } |
int
in
sprejme dva argumenta, prvi je tipa int
in drugi tipa
double
.
Vsaka metoda je definirana v nekem razredu. Če je metoda
foo
definirana v razredu Bar
, potem je njeno
polno ime Bar.foo
. Če spustimo ime
razreda, dobimo skrajšano ime foo
.
Metoda vrne rezulat z ukazom
return
, na primer:
public static double povprecje(double x, double y) { double z = (x + y) / 2.0; return z; } |
Klic
Metodo uporabimo tako, da jo pokličemo ali
izvedemo. Pri klicu metode moramo navesti njeno polno
ime. Če metodo kličemo iz istega razreda, v katerem je
definirana, lahko uporabimo skrajšano ime.
Privatne metode lahko kličemo samo iz razreda, v katerih so
definirane. Javne metode lahko kličemo iz vseh razredov.
Statična metoda se pokliče takole:
Se pravi, navedemo polno ali skrajšano ime metode in nato vse
argumente v oklepajih, ločene z vejicami. Če metoda ne sprejme nobenih
argumentom, napišemo
ime_metode(arg1, arg2, .., argN) |
()
.
Objektna metoda se vedno kliče na objektu:
Tu je
V zgornjem primeru vidimo pet klicev metod:
obj.ime_metode(arg1, arg2, ..., argN) |
obj
objekt, na katerem se kliče metoda, nato
sledi polno ali skrajšano ime metode in še vsi argumenti, ločeni
z vejicami. Na primer:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Bar { public static int foo(int k) { double x = (int)(k * Math.sin(0.1230)); return x * x; } public static void main(String[] args) { String s = args[0]; int k = s.length(); int m = foo(k) + Bar.foo(k + 2); System.out.println(m + k); } } |
- 3. vrstica: kliče se statična metoda
Math.sin
, ki sprejme argument0.1230
. - 9. vrstica: kliče se objektna metoda
length
na objektus
, ki ne sprejme nobenih argumentov. - 10. vrstica: dvakrat se kliče statična metoda
Bar.foo
, enkrat s skrašanim in enkrat s polnim imenom, ki enkrat sprejme argumentk
in drugičk + 2
. - 11. vrstica: kliče se objektna metoda
println
na objektuSystem.out
, ki sprejme argumentm + k
.
Povezmimo, kaj smo se naučili:
|
Naloga 1
1 2 3 4 5 6 7 8 9 10 | public static int vsota(int n) { int r = 1; for (int i = 1; i < n; i = i + 1) { r = i * r; } return r; } |
- Kako je ime metodi?
- Kakšen je tip rezultata, ki ga vrača metoda?
- Koliko argumentov sprejme metoda?
- Kakšni so tipi in imena argumentov?
- Kaj metoda počne? Ali lahko predlagaš boljše ime za metodo?
- Napiši program
Demo.java
, ki demonstrira delovanje metode.
Naloga 2
Napiši metodo
double povprecje(double[] a)
, ki
izračuna povprečje števil, ki so podana v argumentu
a
.
S primerom pokaži, kako metoda deluje.
Naloga 3
Napiši metodo
inicialke
, ki sprejme dva niza
znakov (ime in priimek) in vrne niz sestavljen iz inicialk. Na
primer, inicialke("France", "Preseren")
naj vrne niz
"F.P."
.
"Dril"
Kako se po slovensko reče "dril"?
Pri vsaki vaji preizkusi, ali tvoja metoda deluje na nekaj primerih.
Naloga 5
Napiši metodo
public static int vecje(int a, int b)
, ki
sprejme dve celi števili in vrne večje od njiju.
Naloga 7
Napiši metodo
Vrednost spremenljivke
public static String kopije(String s, int k)
,
ki sprejme niz s
in pozitivno celo število k
ter
vrne niz, ki je sestavljen iz k
kopij niza s
. Na primer:
String a = kopije("bla", 4); |
a
je "blablablabla"
.
Naloga 8
Napiši metodo
...
Dodatna naloga: metoda naj pravilno deluje tudi za števila večja od
100. Se pravi, da
public static String limona(int k)
, ki
deluje takole:
limona(1)
vrne "1 limona"
limona(2)
vrne "2 limoni"
limona(3)
vrne "3 limone"
limona(4)
vrne "4 limone"
limona(5)
vrne "5 limon"
limona(6)
vrne "6 limon"
...
limona(1201)
vrne "1201 limona"
.
Naloga 9
Napiši metodo
public static int vsota(int n)
, ki sprejme
pozitivno celo število n
in vrne vsoto števil
1 + 2 + 3 + ... + n
Naloga 10
Napiši metodo
public static double geometrijska_vrsta(double a,
double r, int n)
, ki sprejme realni števili a
in
r
in celo število n
, ter vrne vsoto geometrijske
vrste
a + a * r + a * r2 + a * r3 + ... + a * rn
Naloga 11
Napiši metodo
public static boolean ima_resitev(double a, double
b, double c)
, ki sprejme tri realna števila a
,
b
in c
, ter vrne true
, če ima kvadratna enačba
a * x2 + b * x + c = 0
realno rešitev.