Windows käsurida
Igale arvutile on töötamiseks paigaldatud operatsioonisüsteem (näiteks MS...
Meetoditega tegime juba tutvust numbrite õppimisel, kus nimetasime neid alamprogrammideks. Toome näite kuubi ruumala leidmisega.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class ylesanne8 { public static void main(String[] args) { kuubiRuumala(4,5,6); } public static void kuubiRuumala(int a, int b, int c) { int v = a * b * c; System.out.printf("Kuubi ruumala: %d",v); } } |
Meetodi nimi pannakse kirja väikese algustähega ja võib nii mitu korda välja kutsuda kui soovi on. Millest meetod koosnes:
public
– on nn. ligipääsu modifikaator. Võimaldab ligipääsu igast klassist. Lisaks sellele on olemas veel:private
– ligipääsetav ainult sama klassi põhiseltprotected
– võimaldab liigipääse kõikidele klassidele samas paketis või kui nad laiendavad klassi, siis ka teise paketi klassidele.default
– vaikimisi, kui jätad nähtavuse deklareerimata. Sel juhul on ligipääs igast klassist, mis asub samas paketis.static
– lisame, kui soovime, et tegemist on klassi meetodiga. Muul juhul on tegemist instantsi meetodiga ehk kasutame siis kui loome objekte.void
– tagastustüüp. Kuna meetod midagi ise ei tagasta ja lihtsalt trükib tulemust, siis see näitabki seda. Kui meie meetod peaks väljastama näiteks arve või teksti, siis kasutaksime tagastustüübina vastavalt int
, float
, double
, String
jne.Eclipse IDE võimaldab meil meetodite loomist kiirendada. Näiteks on meil loodud kood, mis genereerib 5 arvu. Selekteeri soovitud kood ja vali menüüst Refactor>Extract Method
Avanenud aknas lisa meetodi nimi, saad valida seaded ja näed eelvaadet.
Ja kui oled OK vajutanud, siis luuakse meetod ja kutsutakse see ka välja.
Me saame meetodile lisada argumente kui palju soovime. Aga kui samatüübilisi argumente on rohkem kui mõni, siis on hea mõte kasutada massiivi. Näiteks on meil vaja liita kõik etteantud arvud, sel juhul kasutame argumendina int... arvud
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class ylesanne8 { public static void main(String[] args) { System.out.println(leiaSumma(1,2,3,4,5,6)); } private static int leiaSumma(int... arvud) { int kokku = 0; for(int arv:arvud){ kokku = kokku+arv; } return kokku; } } |
Ja kuna me kasutasime argumendina massiivi, siis elemendid saame sealt kätte for
-tsükli abil.
Reeglina üritad hoida samas klassis meetodite nimed erinevad. Kuid Java lubab seda teha, kui hoiad meetodite argumentide arvu erineva ja/või muudad andmetüüpide järjekorda. Ja seda kutsutakse siis parameetrite ületäituvuseks (või ülelaadimiseks; overload).
Teeme lihtsa tervituse meetodi, mille väljakutsumine sõltub, kuidas antakse argumendid.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class ylesanne8 { public static void main(String[] args) { tervita("Karin", 18); tervita("Karin", "Eegreid"); tervita("Karin"); } private static void tervita(String nimi) { System.out.println("Tere "+nimi); } private static void tervita(String nimi, String perenimi) { System.out.println("Tere "+nimi+" "+perenimi); } private static void tervita(String nimi, int vanus) { System.out.println("Tere "+nimi+", "+vanus); } } |
Ühel hetkel saab koodi järjest rohkem ja rohkem ning järge pidada on üha keerulisem. Paremaks koodi haldamiseks võimaldab Java meil luua klasse. Ehk meil on võimalik grupeerida meetodid sarnastesse gruppidesse. See, mida ja kui palju sa teise klassi viid on programmeerija enda teha. Tekitan nüüd kaks faili. Esimeses failis on main
meetod, mis vastutab kogu koodi käivitamise eest. Teise faili aga lisan erinevad pindala arvutamise meetodid.
Klassi nimed hakkavad reeglina suure algustähega ning klassi nimi ja faili nimi on täpselt ühesugused. Ja selleks, et ma saaks teise klassi meetoditele ligi, määran ligipääsuks public
.
Pindalad.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class Pindalad { public static double roopkylikS(String a, String h) { float alus = Float.parseFloat(a); float korgus = Float.parseFloat(h); double s = alus * korgus; return s; } public static double ristkylikS(String a, String h) { float alus = Float.parseFloat(a); float korgus = Float.parseFloat(h); double s = alus * korgus; return s; } public static double kolmnurkS(String a, String h) { float alus = Float.parseFloat(a); float korgus = Float.parseFloat(h); double s = alus * korgus/2; return s; } } |
Ja nüüd kui soovin sellest klassist saada mõnda meetodit, siis kasutan punkti süntaksit. Näiteks: s = Pindalad.roopkylikS(alus, korgus);
. Põhiprogrammis, siis tunnen huvi, mida kasutaja tahab leida ning vastavalt sellele kutsun Pindala klassist soovitud meetodi välja.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import java.util.Scanner; public class ylesanne8 { public static void main(String[] args) { Scanner scanner = new Scanner (System.in); System.out.print("Rööpküliku pindala (1) \nRistküliku pindala (2) \nKolmnurga pindala (3)\nVali tegevus: "); String valik = scanner.next(); System.out.print("Sisesta alus: "); String alus = scanner.next(); System.out.print("Sisesta kõrgus: "); String korgus = scanner.next(); double s; switch (Integer.parseInt(valik)) { case 1: s = Pindalad.roopkylikS(alus, korgus); System.out.printf("Rööpküliku pindala on %.2f ",s); break; case 2: s = Pindalad.ristkylikS(alus, korgus); System.out.printf("Ristküliku pindala on %.2f ",s); break; case 3: s = Pindalad.kolmnurkS(alus, korgus); System.out.printf("Kolmnurga pindala on %.2f ",s); break; default: System.out.print("Valikust arusaamine ebaõnnestus!"); break; } } } |
Nagu eelpool mainisin, et klassi ja faili nimi peavad ühtima. Kui aga soovid seda muuta, siis käsitsi on seda päris tüütu teha. Kui Eclipse’s vastava klassi ära selekteerid ja valid menüüst Refactor>Rename…
Avanenud aknas saad lisada klassile uue nime, mis muudab ära ka kõik loodud seosed.
Kasutasime meetodite puhul märksõna static
, mis tähendab, et tegemist on klassi meetodiga ja ei sõltu konkreetsest isendist. Sama on ka klassi muutujatega, kui kasutame sama static
märksõna. Kui ära jätta sama märksõna, siis nimetatakse muutujaid ja meetodeid vastavalt isendimuutujaks (field, instance variable) ning isendimeetodiks (instance method). See tähendab, et need on seotud konkreetse objektiga (object, instance). Objekti loomine toimub märksõnaga new
.
Toome “päriselulise” näite ufode põhjal. Koondame kõik ufode omadused ja tegevused ühte klassi, seega tekitame faili uue klassiga Ufo.class
1 2 3 4 5 | //See on klass public class Ufo { } |
Edasi tahame luua teda iseloomustavad parameetrid. Näiteks mis on ta nimi, vanus, sugu, värvus jne. Sel juhul paneme kirja isendimuutujad. Aga me ei anna neile väärtust, sest me ei tea seda veel, aga antud parameetrid on kõikidel ufonautidel meie arust olemas.
1 2 3 4 5 6 7 8 9 | //See on klass public class Ufo { //isendimuutujad public String nimi; public int vanus; } |
Ja mida ta teha oskab – näiteks oskab end tutvustada.
1 2 3 4 5 6 7 8 9 10 11 12 | //See on klass public class Ufo { //isendimuutujad public String nimi; public int vanus; //isendimeetodid public void tutvustaEnd(){ System.out.println("Mina olen "+nimi+", "+vanus+"! Tulen rahus!"); } } |
Ufo loomiseks on meil nüüd vajalik klass olemas. Kutsume selle põhiprogrammis välja luues uue objekti. Objekti andmetüübiks on sama klassi nimi. Edasi määrame loodud objektile nime ja vanuse ning laseme ennast tutvustada.
1 2 3 4 5 6 7 8 9 10 11 | public class ylesanne8 { public static void main(String[] args) { Ufo tyyp1 = new Ufo(); tyyp1.nimi = "XZXZXX"; tyyp1.vanus = 765; tyyp1.tutvustaEnd(); } } |
Antud klassist saame nüüd luua nii palju isendeid (objekte) kui palju soovime.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class ylesanne8 { public static void main(String[] args) { Ufo tyyp1 = new Ufo(); tyyp1.nimi = "XZXZXX"; tyyp1.vanus = 765; tyyp1.tutvustaEnd(); Ufo tyyp2 = new Ufo(); tyyp2.nimi = "ÕÜÖLÖ"; tyyp2.vanus = 385; tyyp2.tutvustaEnd(); } } |
Ehk siis kui uuesti läbi korrata, siis
Konstruktor (constructor) on kood, mis käivitatakse vaikimisi hetkel kui uus objekt luuakse. Näeb välja nagu meetod kuid puudub tagastustüüp ja kannab sama nime mis klass. Kuna see luuakse objekti loomise ajal, siis on sellega võimalik edasi anda mingid parameetrid.
Võtame näiteks sama Ufo klassi. Loome konstruktori, kus saame kohe lisada ufonaudi nime ja vanuse.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class Ufo { //isendimuutujad public String nimi; public int vanus; //konstruktor public void Ufo(String n, int v){ this.nimi = n; this.vanus = v; } //isendimeetodid public void tutvustaEnd(){ System.out.println("Mina olen "+nimi+", "+vanus+"! Tulen rahus!"); } } |
Seega põhiprogrammis saame nüüd selle välja kutsuda palju mugavamalt.
1 2 3 4 5 6 7 8 9 | public class ylesanne8 { public static void main(String[] args) { Ufo tyyp1 = new Ufo("XZXZXX", 765); tyyp1.tutvustaEnd(); } } |
Kuna Ufo klassi isendimuutujad on public
ligipääsuga, siis hetkel oleks võimalik tyyp1.nimi = "uus nimi"
abil nime muuta.
Ka konstruktorid võimaldavad ülelaadimist. Ehk kui me muudame parameetrite tüüpe või arvu. Näiteks kui ufonaudi objekti loomisel ei lisata nime ja vanus, siis l
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class Ufo { //isendimuutujad public String nimi; public int vanus; //konstruktor public void Ufo(String n, int v){ this.nimi = n; this.vanus = v; } public void Ufo(){ this.nimi = "<tundmatu>"; this.vanus = 0; } //isendimeetodid public void tutvustaEnd(){ System.out.println("Mina olen "+nimi+", "+vanus+"! Tulen rahus!"); } } |