skripta iz jave

33
Uvod u Java programski jezik Ana Vignjevi ´ c Marko ˇ Cupi ´ c

Upload: mersa-muminovic

Post on 10-Nov-2014

101 views

Category:

Documents


9 download

DESCRIPTION

Java, zadaci i primjeri

TRANSCRIPT

Page 1: Skripta iz Jave

Uvod u Java programski jezik

Ana VignjevicMarko Cupic

Page 2: Skripta iz Jave

Uvod u Java programski jezikby Ana Vignjevic and Marko Cupic

Abstract

Ovaj dokument namijenjen je polaznicima Java - tecaja i služi kao popratni materijal.

Page 3: Skripta iz Jave

Table of Contents1. Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Struktura Java programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Razvoj Java programa u razvojnom okruženju Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Struktura Java datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Komentari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Nekoliko jednostavnih primjera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Rad sa stringovima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2. Razredi i objekti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Primjer strukture u C-u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Java razredi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

Primjeri uporabe razreda GometrijskiLik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21Java razred Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

iii

Page 4: Skripta iz Jave

List of Figures1.1. Spremanje programa i izvršivog koda u isti direktorij . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2. Spremanje programa i izvršivog koda u odvojene direktorije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3. File->New->Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.4. Definiranje detalja novog projekta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.5. New->Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.6. Definiranje detalja novog paketa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.7. Novi razred . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.8. Definiranje detalja HelloWorld razreda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.9. HelloWorld.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.10. Tijelo main() metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.11. Pokretanje Hello World programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.12. Rezultat izvodenja Hello World programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

iv

Page 5: Skripta iz Jave

List of Examples1.1. Hello World program (datoteka HelloWorld.java) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2. Ispis argumenata iz predanih preko komandne linije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.3. Racunanje sume reda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.4. Ispis decimalnih brojeva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.5. Primjer citanja s tipkovnice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.6. Nekoliko nacina ispisa Stringova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.7. Spajanje teksta operatorom "+" kroz nekoliko linija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.8. Spajanje teksta operatorom "+" u jednoj naredbi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.9. Spajanje teksta uporabom StringBuffer razreda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.10. Spajanje teksta uporabom StringBuffer razreda - sa procjenom kolicine teksta . . . . . . . . . . . . . . . . . 182.1. Struktura u C-u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.2. Rad sa strukturama u C-u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.3. Razred GeometrijskiLik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.4. Uporaba razreda GeometrijskiLik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.5. Implementacija razreda Linija kao posebne vrste geometrijskog lika: . . . . . . . . . . . . . . . . . . . . . . . . . . 222.6. Pravokutnik je poseban geometrijski lik: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.7. Dopuna razreda GeometrijskiLik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.8. Dopuna razreda Linija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.9. Dopuna razreda Pravokutnik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.10. Primjer usporedbe objekata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.11. Primjer usporedbe Stringova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.12. Kvadrat je poseban geometrijski lik: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

v

Page 6: Skripta iz Jave

Chapter 1. UvodJava programski jezik danas je jedan od najraširenijih programskih jezika, i spada u grupu objektnoorijentiranih programskih jezika. Java osim samog programskog jezika ujedno definira i cijelookruženje u kojem se programi izvode, nudeci pri tome vrlo velik broj gotovih biblioteka i funkcija.Zahvaljujuci tome, pisanje programa može ici vrlo brzo i efikasno. Osim toga, Java programi neprevode se direktno u instrukcije procesora na kojem se izvršava razvojna okolina, vec u posebanmeduformat poznat kao byte-code. Na svim popularnijim operacijskim sustavima danas postoje Javavirtualni strojevi (engl. Java virtual machine) koji izvršavaju generirani byte-code. Programi pisaniu Javi stoga se mogu smatrati potpuno platformski nezavisnima, i jednako se mogu izvršavati naprimjerice Microsoft Windows te Linux operacijskim sustavima.

Struktura Java programaOsnovna struktura Java programa prikazana je u primjeru the section called “Struktura Java programa”[1]

Example 1.1. Hello World program (datoteka HelloWorld.java)

package hr.fer.zemris.java.tecaj_0;/*** @author Ana Vignjevic

* @version 1.0

*/public class HelloWorld {

/*** Metoda koja se poziva prilikom pokretanja programa.

* Argumenti su objašnjeni u nastavku.

* @param args Argumenti iz komandne linije.

*/public static void main(String[] args) {

System.out.println("Hello World!");}

}

Primjer definira razred HelloWorld u kojem se nalazi metoda main (izvodenje programa zapocinjepozivom ove metode). Kako bi se smanjila kompleksnost koda, Java programski jezik uvodi pojampaketa kao nacin grupiranja više slicnih razreda. U liniji 1 nalazi se definicija paketa (kljucna rijecpackage). Paketi predstavljaju hijerarhijsko grupiranje razreda, te i sami mogu sadržavati podpakete.U našem slucaju, razred HelloWorld smjestili smo u paket hr.fer.zemris.java.tecaj_0. Pri tome trebavoditi racuna da hijerarhijsko ime paketa mora odgovarati strukturi direktorija na disku, što znaci dace datoteka HelloWorld.java biti smještena u direktorij hr/fer/zemris/java/tecaj_0.

Pretpostavimo da cemo sve primjere spremati u direktorij C:\JavaPrimjeri. HelloWorld.java datotekuprevodimo tako da se pozicioniramo u direktorij JavaPrimjeri i izvršimo sljedecu naredbu:

JavaPrimjeri> javac hr/fer/zemris/java/tecaj_0/HelloWorld.java

1

Page 7: Skripta iz Jave

Uvod

Rezultat gornje naredbe je nova datoteka HelloWorld.class koja sadrži izvršivi kod našeg programa inalazi se u istom direktoriju kao i izvorna .java datoteka.

Figure 1.1. Spremanje programa i izvršivog koda u isti direktorij

Program pokrecemo naredbom java nakon koje navedemo puno ime razreda bez ekstenzije .class:

JavaPrimjeri> java -cp .hr.fer.zemris.java.tecaj_0.HelloWorld

Hello World!

Na nekim sustavima Java je po defaultu konfigurirana tako da izvršive datoteke (datoteke sekstenzijom .class) traži u trenutnom direktoriju. U tom slucaju pokretanje Java programa može seostvariti i bez prekidaca -cp ., dakle ovako:

JavaPrimjeri> java hr.fer.zemris.java.tecaj_0.HelloWorld

Ukoliko odlucimo odijeliti izvorni program od izvršivog koda tada prevodenje i izvodenje programa,te struktura direktorija izgleda ovako:

JavaPrimjeri> javac -d bin -sourcepath src src/hr/fer/zemris/java/tecaj_0/HelloWorld.java

To ce smjestiti izvršivi kod u direktorij bin sa pripadnom strukturom direktorija. Program se izvodisljedecom naredbom:

JavaPrimjeri> java -cp bin hr.fer.zemris.java.tecaj_0.HelloWorld

Struktura direktorija za gore navedeni primjer izgleda ovako:

Figure 1.2. Spremanje programa i izvršivog koda u odvojene direktorije

2

Page 8: Skripta iz Jave

Uvod

Razvoj Java programa u razvojnom okruženjuEclipse

Razvojno okruženje Eclipse i detaljne upute za instalaciju i pokretanje moge se pronaci sa sljedecojadresi: http://www.eclipse.org/ Slijedi opis procedure stvaranja i pokretanja HelloWorld programapomocu Eclipsa. Prvo stvaramo novi projekt, odabravši u izborniku File->New->Project(Figure 1.3, “File->New->Project”)

Figure 1.3. File->New->Project

U prozoru nakon toga potrebno je odabrati opciju Java Project i nakon toga next. U di-jalogu New Java Project (Figure 1.4, “Definiranje detalja novog projekta”) treba unijeti imeprojekta (JavaPrimjeri), odabrati opciju Create new project in workspace i Createseparate source and output folders.

Figure 1.4. Definiranje detalja novog projekta

3

Page 9: Skripta iz Jave

Uvod

Nakon što smo definirali svoj projekt, deklariramo novi paket unutar njega, u kojem ce se nalazitisvi naši razredi. Desnim klikom na naš projekt u izborniku odabiremo New->Package (Figure 1.5,“New->Package”)

Figure 1.5. New->Package

Slijedi imenovanje paketa hr.fer.zemris.java.tecaj_0 (Figure 1.6, “Definiranje detaljanovog paketa”) te potom finish.

Figure 1.6. Definiranje detalja novog paketa

4

Page 10: Skripta iz Jave

Uvod

Nakon što je okolina za rad pripremljena, stvaramo svoju razred; desnim klikom na naš projekt, tezatim New->Class(Figure 1.7, “Novi razred”),

Figure 1.7. Novi razred

cime smo dobili novi izbornik u kojem definiramo sve potrebno za naš HelloWorld program(Figure 1.8, “Definiranje detalja HelloWorld razreda”).

Figure 1.8. Definiranje detalja HelloWorld razreda

5

Page 11: Skripta iz Jave

Uvod

Time je kreirana naš razerd sa vec postojecom main metodom, koju sada samo trebanapisati.(Figure 1.9, “HelloWorld.java”)

Figure 1.9. HelloWorld.java

Na Figure 1.10, “Tijelo main() metode” možemo vidjeti napisani void main(). Iznad mainmetode se nalazi komentar pomocu kojeg cemo kasnije moci generirati dokumentaciju (izbornikProject->Generate Javadoc).

Figure 1.10. Tijelo main() metode

6

Page 12: Skripta iz Jave

Uvod

Još nam samo ostaje pokretanje HelloWorld programa, a to cinimo na sljedeci nacin: Ispod Sourceizbornika odaberemo zeleni krug sa strelicom, te u dobivenom izborniku odaberemo Run As->1Java Application (Figure 1.11, “Pokretanje Hello World programa”).

Figure 1.11. Pokretanje Hello World programa

Na sljedecoj slici Figure 1.12, “Rezultat izvodenja Hello World programa” se vidi ispis naše poruke ukonzoli.

Figure 1.12. Rezultat izvodenja Hello World programa

Struktura Java datotekeSvo programiranje u Javi se odvija u razredima. Ime razreda je ujedno i ime programa. Svaka Javadatoteka sastoji se od tri dijela:

1.) Deklaracija paketa kojem razred priprada (package)

package hr.fer.zemris.java.tecaj_0;

pri cemu ime paketa predstavlja hijerarhijski prikaz strukture direktorija u kojem se nalazi našadatoteka.

7

Page 13: Skripta iz Jave

Uvod

2.)opcionalni popis paketa koje treba ukljuciti (import). U HelloWorld datoteci nije bilo potrebe zaukljucivanjem drugih razreda, no u primjeru sa ispisom decimalnih brojeva trebalo je ukljuciti razredDecimalFormat:

import java.text.DecimalFormat;

3.)deklaracija samog razreda

public class HelloWorld {...}

Java programski jezik podržava gniježdenje, što znaci da unutar jednog razreda možemo deklariratidruge razrede.

package hr.fer.zemris.java.tecaj_0;

public class JavniRazred {...public static class NekiDrugiRazred {

...}

}}

Takoder, unutar jedne Java datoteke možemo deklarirati proizvoljan broj razreda, no treba voditiracuna da samo jedan može biti javan, a njegovo ime mora biti isto onome kojeg nosi sama datoteka.

package hr.fer.zemris.java.tecaj_0;

public class JavniRazred {...

}class NekiDrugiRazred {

...}

Da bi se neki program mogao izvršiti on mora sadržavati metodu main(). U slucaju Hello Worldprograma, main metoda je deklarirana na sljedeci nacin:

public static void main(String[] args) {...

}

Deklaracija metode sadrži tri modifikatora koji ce kasnije biti detaljnije objašnjeni:

8

Page 14: Skripta iz Jave

Uvod

• public - primjer jednog javnog razreda

• static - metoda pripada samom razredu, te nije potrebno stvariti instancu tog rezreda da bi semogla koristiti

• void - metoda ne vraca ništa

Inacica Hello World programa za programski jezik C bi bila:

void main(int argc, char *args[]) {printf("Hello World!\n");

}

KomentariKomentiranje koda je iznimno važno. Detaljni i jasni komentari olakšavaju pracenje toka programate lociranje potencijalnih problema, kao i brži pristup onim dijelovima koje želimo modificirati ilioptimizirati. Java stavlja poseban naglasak na komentare, te definira dvije vrste:

obican komentar:

// ovo je komentar

/* ovo je komentar */Komentari koji zapocinju sa "//" su jednolinijski komentari, dok se "/* ...*/" mogu protezati krozproizvoljan broj redaka, te su idealni za npr. opis metoda, detaljno komentiranje kompleksnijihdijelova koda itd.

javadoc komentar:

/** ovo je javadoc komentar */Ovo su takoder višelinijski komentari, no oni se koriste pri generiranju dokumentacije.

Obicni komentari se ne razlikuju od onih u C programskom jeziku, dok javadoc komentariomogucavaju programeru generiranje strukturirane dokumentacije pomocu posebnih oznakasljedeceg oblika:@naziv vrijednost:

@author ime_autora, npr. - @author Marko Cupic

@version verzija_razreda, npr. - @version 1.0

@param ime_argumenta opis, npr. - @param x broj ciji sinus treba izracunati

@return opis, npr. - @return vraca sinus zadanog broja

Komentari se koriste za opis metoda, ali i samih razreda (formalni komentari - npr. autor, verzija).Dokumentacija se generira odabirom izbornika Project->Generate Javadoc. Rezultat je lijepostrukturiran i jasan pregled opisa svih komentiranih metoda - što metode primaju kao argumente,uvjeti koji moraju biti zadovoljeni da bi metoda radila ispravno, što tocno metode rade, te koji jerezultat njihovog izvodenja. Primjer jasnog i razumljivog komentara:

/*** Metoda racuna y-tu potenciju od broja x.

* @param x argument x

9

Page 15: Skripta iz Jave

Uvod

* @param y argument y; mora biti nenegativan

* @return vraca iznos izraza x^y

*/public static double pow(int x, int y) {...

}

Nekoliko jednostavnih primjera

Example 1.2. Ispis argumenata iz predanih preko komandne linije

Napisati program koji ce na zaslon ispisati argumente koje dobiva prilikom pokretanja programa.

package hr.fer.zemris.java.tecaj_1;

/*** @author Marko Cupic

* @version 1.0

*/public class IspisArgumenata {

/*** Metoda koja se poziva prilikom pokretanja

* programa. Argumenti su objasnjeni u nastavku.

* @param args Argumenti iz komandne linije.

*/public static void main(String[] args) { int brojArgumenata = args.length;

for(int i = 0; i < brojArgumenata; i++) {System.out.println("Argument " + (i+1) + ": " + args[i]);}}

}

Opis rješenja:

Metoda prima polje Stringova preko komandne linije (String je poseban tip podataka u Javaprogramskom jeziku, nad kojim je definiran bogat skup funkcija za ispis, pretraživanje i spajanje).Polja kao objekti, imaju pripadnu varijablu length koja nam daje do znanja upravo duljinu tog polja.Takoder smo prije dodjeljivanja vrijednosti duljine polja u lokalnu varijablu brojArgumenatamogli provjeriti da li je polje uopce predano, te u skladu sa rezultatom upita eventualno zavrsitiizvodenje programa:

10

Page 16: Skripta iz Jave

Uvod

if(args==null || args.length==0) {return;

}

Ulazimo u for petlju te se na zaslon redom ispisuju predani argumenti u sljedecem formatu: "Argument(redni_broj_argumenta): vrijednost_argumenta". Primjetimo da poziv System.out.println() kaoargument ocekuje varijablu tipa String, a predane su varijable tipa String i int. U Javi se operator"+" koristi u operacijama sa Stringovima kao spajanje, a sam ispis je podržan za sve tipove varijabli,bez eksplicitnog navodenja formata ispisa (dok u je C programskom jeziko za polja znakova bilonužno navesti "%s" za znakovne nizove ili "%d" za cjelobrojne tipove). Takoder, metoda i razred suprikladno komentirani.

Example 1.3. Racunanje sume redaPrimjer: Napisati program koji ce prilikom pokretanja primiti jedan argument (x), te izracunati kolikoiznosi e^x razvojem u Taylorov red. Razvoj riješiti u zasebnoj funkciji. Program na zaslon moraispisati rezultat.

Skica rješenja: Razred koji treba napraviti ce sadržavati main() metodu, pomocu koje cemo pokretatiprogram, i posebnu metodu koja ce racunati e^x za parametar x kojeg joj treba predati kao argument. UJavi prevodenje programa nije uvjetovano redoslijedom definiranja metoda koje koristimo, što znacida metoda za racunanje e^x može biti napisana ispred, ali i iza metode main() u kojoj se poziva.Takoder, deklaracija lokalnih variabli je moguca u bilo kojem trenutku, i bilo kojem mjestu u kodu,jedino treba voditi racuna da onaj raspon unutar kojeg se varijabla deklarira uvjetuje njen ivotni vijek.Pokazalo se kao dobra praksa deklaraciju lokalnih varijabli vršiti upravo na onom mjestu gdje tevarijable pocinjemo koristiti, prvenstveno da bi se eliminirale moguce greške. Da bismo protumaciliString kao broj koristimo metodu razreda Double koja kao argument prima String, te ga parsira ubroj ukoliko je to moguce (možda uopce nije predan String koji sadržava broj), a vraca vrijednostprotumacenog broja.

11

Page 17: Skripta iz Jave

Uvod

package hr.fer.zemris.java.tecaj_1;

/*** @author Marko Cupic

* @version 1.0

*/public class SumaReda {

/*** Metoda koja se poziva prilikom pokretanja

* programa. Argumenti su objašnjeni u nastavku.

* @param args Argumenti iz komandne linije.

*/public static void main(String[] args) {

if(args.length != 1) {System.err.println("Program mora imati jedan argument!");System.exit(1);}

double broj = Double.parseDouble(args[0]);

System.out.println("Racunam sumu...");

double suma = racunajSumu(broj);

System.out.println("f(" + broj + ")=" + suma + ",");}

/*** Racuna e^x razvojem u Taylorov red, prema formuli:

* e^x=1+x+(x^2/(2!))+(x^3/(3!))+(x^4/(4!))+...

* @param broj argument funkcije e^x

* @return iznos funkcije u tocki x=broj dobiven kao

* suma prvih 10 clanova Taylorovog reda.

*/private static double racunajSumu(double broj) {double suma = 0.0;double potencija = 1.0;double faktorijela = 1.0;

suma += 1.0;

for(int i = 1; i < 10; i++) {potencija = potencija * broj;faktorijela = faktorijela * i;suma += potencija/faktorijela;}return suma;}

}

12

Page 18: Skripta iz Jave

Uvod

Example 1.4. Ispis decimalnih brojevaPrimjer: Napisati program koji ce sadržavati funkciju koja prima polje double-ova, te ih ispisuje nazaslon po zadanom formatu. Napisati glavni program koji ce ispisati brojeve:

• Najmanje tri mjesta za cijelobrojni dio, dva mjesta za decimalni

• Dva + dva mjesta s obaveznim ispisom predznaka

Skica rješenja:

Razred koji treba napraviti ce sadržavati main() metodu, pomocu koje cemo pokretati program, iposebnu metodu za ispis pbrojeva prema zadanom formatu. U ovom primjeru smo u našem razredukoristili i jedan drugi razred (java.text.DecimalFormat) kojeg smo ukljucili sa kljucnomrijeci import ispred punog imena tog razreda, a prije deklaracije našeg razreda. Format u kojemje potrebno ispisati brojeve se definira kao String; u prvom slucaju "000.00", što ce rezultirati ispisombrojeva na (najmanje) tri mjesta za cjelobrojni, i dva mjesta za decimalni dio; u drugom "+00.00;-00.00" što ce se interpretirati kao ispis na (najmanje) dva cjelobrojna, i dva decimalna mjesta, saobaveznim ispisom predznaka. Prvi dio formata, prije separatora ";" definira znak ispisa za pozitivne,a drugi za negativne brojeve.

package hr.fer.zemris.java.tecaj_1;

import java.text.DecimalFormat;

/*** @author Marko Cupic

* @version 1.0

*/public class FormatiraniIspisDecBrojeva {

/*** Metoda na standardni izlaz ispisuje polje decimalnih

* brojeva prema zadanom formatu.

* @param polje polje decimalnih brojeva koje treba ispisati.

* @param format format koji govori kako polje treba ispisati.

* @see DecimalFormat

*/public static void ispis(double[] polje, String format) {DecimalFormat formatter = new DecimalFormat( format );for(int i = 0; i < polje.length; i++) {

System.out.println("(" + i + "): [" + formatter.format(polje[i]) + "]" );

}}

13

Page 19: Skripta iz Jave

Uvod

/*** Metoda koja se poziva prilikom pokretanja

* programa. Argumenti su objasnjeni u nastavku.

* @param args Argumenti iz komandne linije.

*/public static void main(String[] args) {double[] brojevi = new double[] {3.712, 55.813, 55.816, -4.18};ispis(brojevi, "000.00");ispis(brojevi, "+00.00;-00.00");}

}

Example 1.5. Primjer citanja s tipkovnicePrimjer: Napisati program koji ce s tipkovnice citati decimalni broj po broj i racunati njihovu sumu,sve dok se upisuju nenegativni brojevi.

Skica rješenja: citanje s tipkovnice je nešto kompliciranje, pa sljedeci kod može poslužiti kaošablona. Koristimo razrede BufferedReader i InputStreamReader iz paketa java.io(input/output) koje smo ukljucili kljucnom rijeci import. Instanca InputStreamReader-a primaargument System.in, a nju onda predajemo kao argument instanci BufferedReader-a jer upravotaj razred ima definirane one metode koje su nam potrebne za rješavanje ovog zadatka (metodareadLine()). U lokalnu varijablu "redak" spremamo ono sto je metoda readLine() dohvatila satipkovnice, te taj String tumacimo kao broj sa vec spomenutom metodom parseDouble razredaDouble. Ostatak rješenja je trivijalan. Nakon što smo završili sa radom, potrebno je pozvati metoduclose() nad reader.om koja ce kaskadno zatvoriti i instancu InputStreamReader-a. Instanca nekograzreda je deklalirani primjerak tog razreda, tj. objekt. Deklarirali smo primjerak BufferedReader-asa sljedecom linijom koda (pozivanjem konstruktora):

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)

);

baš kao što deklariramo i lokalne varijable, npr.:

String linija = new String(); // ili = "ovo je neki string";...int i = 0;

14

Page 20: Skripta iz Jave

Uvod

package hr.fer.zemris.java.tecaj_1;

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;

/*** @author Marko Cupic

* @version 1.0

*/public class CitanjeSTipkovnice {

/*** Metoda koja se poziva prilikom pokretanja

* programa. Argumenti su objašnjeni u nastavku.

* @param args Argumenti iz komandne linije.

*/public static void main(String[] args) throws IOException {System.out.println("Program za racunanje sume pozitivnih brojeva.");

System.out.println("Unosite brojeve, jedan po retku.");System.out.println("Kada unesete negativan broj, ispisat ce se suma.");

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)

);

double suma = 0.0;while(true) {String redak = reader.readLine();if(redak==null) break;double broj = Double.parseDouble(redak);if(broj<0) break;suma += broj;

}System.out.print("Suma je: ");System.out.println(suma);

reader.close();}

}

Rad sa stringovimaU Javi String nije polje znakova terminirano s "\0". Pošto sam nacin pohrane Stringova u memorijinije bitno za samo programiranje, korištenje ovog razreda je uveliko olakšano .

Example 1.6. Nekoliko nacina ispisa Stringova

15

Page 21: Skripta iz Jave

Uvod

Primjer: Nekoliko nacina ispisa stringova sa procjenom efikasnosti. Prvo slijedi razred koji ce namposlužiti za demonstraciju efikasnosti korištenja operatora "+" te drugih operacija za manipulacijuStringovima.

package hr.fer.zemris.java.tecaj_1;

/*** @author Marko cupic

* @version 1.0

*/public class RadSaStringovima {

/*** Metoda koja se poziva prilikom pokretanja

* programa. Argumenti su objasnjeni u nastavku.

* @param args Argumenti iz komandne linije.

*/public static void main(String[] args) {ispis1();ispis2();ispis3();ispis4();

}private static void ispis1() {...}private static void ispis2() {...}private static void ispis3() {...}private static void ispis4() {...}

}}

Example 1.7. Spajanje teksta operatorom "+" kroz nekoliko linijaMetoda ispis1() prvo stvara novi String te ga inicijalizira na null vrijednost. Zatim se "dodavanje"teksta vrši obicnim pridjeljivanjem i to operatorom "=". Pridjeljivanje se može obaviti i sakonstrukcijom "+=" baš kao što smo to cinili sa numericim podacima. Ovaj pristup je iznimnoneefikasan zato što ce korištenjem operatora "+" biti interno realociran novi String da bi duljinomodgovarao nadodanom tekstu, a to se cini kroz nekoliko naredbi.

16

Page 22: Skripta iz Jave

Uvod

/*** Demonstracija zbrajanja stringova.

* Zbrajanje uporabom operatora + kroz vise naredbi.

* Vrlo neefikasno!

*/private static void ispis1() {String tekst = null;tekst = "The quick " + "brown ";tekst += "fox jumps over ";tekst += 3;tekst += " lazy dogs.";System.out.println(tekst);}

Example 1.8. Spajanje teksta operatorom "+" u jednoj naredbiMetoda ispis2() prvo stvara novi String te ga inicijalizira na null vrijednost. Premda se ovdjeoperator "+" koristi samo dva puta i u samoj jednoj naredbi, ovaj pristup je i dalje dosta neefikasan.

/*** Demonstracija zbrajanja stringova.

* Zbrajanje operatorom + u jednoj naredbi. Efikasnije.

*/private static void ispis2() {String tekst = null;int broj = 3;tekst = "The quick brown fox jumps over " +broj+ " lazy dogs.";System.out.println(tekst);}

Example 1.9. Spajanje teksta uporabom StringBuffer razredaMetoda ispis3() koristi drugaciji pristup, koristeci razred StringBuffer. Stvara se spremnikneke inicijalne velicine, te u njega dodaje tekst, no pošto su i ovdje bile potrebne tri realokacije da bise spremnik adekvatno proširio, pristup je jednake efikasnosti kao prethodni primjer.

17

Page 23: Skripta iz Jave

Uvod

/*** Demonstracija zbrajanja stringova.

* Zbrajanje uporabom StringBuffer objekta. Jednako efikasno

* kao i primjer 2. Naime, inicijalno se stvara spremnik

* velicine 16 koji se tri puta realocira kako bi se prosirio.

* Napomena: od Java 5.0 koristiti StringBuilder koji je bitno

* brzi (ali se mora koristiti unutar jedne dretve).

*/private static void ispis3() {String tekst = null;StringBuffer sb = new StringBuffer();sb.append("The quick ").append("brown ");sb.append("fox jumps over ").append(3);sb.append(" lazy dogs.");tekst = sb.toString();System.out.println(tekst);}

Example 1.10. Spajanje teksta uporabom StringBuffer razreda - sa procjenomkolicine tekstaMetoda ispis4() je najefikasnija od navedenih. Pošto možemo procijeniti kolicinu teksta kojegželimo upisati, unaprijed se alocira spremnik odgovarajuce velicine.

/*** Demonstracija zbrajanja stringova.<br>

* Zbrajanje uporabom StringBuffer objekta. Najefikasnije

* ako unaprijed znamo potrebnu velicinu spremnika. U primjeru

* se alocira spremnik velicine 50 znakova.

* Napomena: od Java 5.0 koristiti StringBuilder koji je bitno

* brzi (ali se mora koristiti unutar jedne dretve).

*/private static void ispis4() {String tekst = null;StringBuffer sb = new StringBuffer(50);sb.append("The quick ").append("brown ");sb.append("fox jumps over ").append(3);sb.append(" lazy dogs.");tekst = sb.toString();System.out.println(tekst);}

Od Jave 5.0 cešce se koristi razred StringBuilder jer je znatno brži, no njegovo ogranicenje je to da semora koristiti unutar jedne dretve.

18

Page 24: Skripta iz Jave

Chapter 2. Razredi i objektiPonekad potrebe nekog odredenog programskog zadatka premašuju raspoloživ skup tipova podataka.Za izradu kompleksnih tipova podataka, C nudi strukture.

Primjer strukture u C-uStruktura koja predstavlja geometrijski lik prikazan je u sljedecem primjeru.

Example 2.1. Struktura u C-u

typedef struct pravokutnik_str {int poz_x;int poz_y;int sirina;int visina;char *ime;

} pravokutnik;

Svojstva ovog pristupa su sljedeca: Svatko može mijenjati vrijednosti clanova strukture, bez ikakveprovjere da li postoje ovlasti koje to mijenjanje dopuštaju. Takoder, ne postoji nikakav nacin kontrolepostavljanja legalnih, tj. smislenih vrijednosti clanova strukture. Jedno od mogucih rješenja bi bilazabrana direktnog korištenja clanova strukture ili razvijanje posebnog skupa funkcija koje ce se zatimkoristiti pri daljenjem radu sa strukturom. Slijede primjeri funkcija za stvaranje jednog primjerka testrukture, njegovo uništavanje te postavljanje/mijenjanje njegovih vrijednosti uz kontrolu valjanostipredanih vrijednosti:

Example 2.2. Rad sa strukturama u C-uFunkcija pravokutnik_novi ce pokušati alocirati prostor za jedan primjerak strukturepravokutnik, te njegovim clanovima pridijeliti dostupne vrijednosti.

pravokutnik *pravokutnik_novi(int x, int y, int s, int v, char *ime) {pravokutnik *novi = (pravokutnik*)malloc(sizeof(pravokutnik));if(novi == NULL) return NULL;novi->ime = (char*)malloc(strlen(ime)+1);if(novi->ime == NULL) return NULL;strcpy(novi->ime, ime);novi->poz_x = x;novi->poz_y = y;novi->sirina = s;novi->visina = v;return novi;

}

Funkcija pravokutnik_unisti ce osloboditi memoriju koju je zauzimao predani primjerakstrukture pravokutnik.

19

Page 25: Skripta iz Jave

Razrediiob-jekti

void pravokutnik_unisti(pravokutnik *p) {if(p == NULL) return;if(p->ime != NULL) free(p->ime);free(p);return;

}

Funkcija pravokutnik_postavi_sirinu ce se pobrinuti da se clanskoj varijabli sirina pridijelisamo smislena vrijednost, ili nikakva.

void pravokutnik_postavi_sirinu(pravokutnik *p, int s) {if(s < 1) return;p->sirina = s;return;

}

Funkcija pravokutnik_dohvati_sirinu služi za dohvat vrijednosti clanske varijable kojacuva širinu.

int pravokutnik_dohvati_sirinu(pravokutnik *p) {return p->sirina;

}

Ukoliko limitiramo rad nad strukturom samo na gornje funkcije prvenstveno se smanjuje mogucnostpogreške u kodu (npr. funkcija za stvaranje napisana je samo na jednom mjestu). Takoder, clanovinece biti postavljani na nekonzistentne vrijednosti. No nemoguce je osigurati se da svi koristenavedene funkcije. Postoji još jedan problem: Kako postici specijalizaciju strukture, ili dodavanjenovih polja toj strukturi?

Java razrediJava programski jezik uvodi poopcene "C-strukture" - razrede (engl. class). Na elementarnom nivou,razred je struktura, koja osim clanskih varijabli ima i vlastite funkcije ("metode"), te nudi kontrolupristupa (tko može pristupiti cemu). Da bi se stvorio primjerak jednog razreda (objekt), poziva seposebna metoda koja se zove konstruktor (ekvivalent funkcije pravokutnik_novi). Za uništavanjeobjekta u Javi ne postoji posebna metoda jer za to nema potrebe - ukoliko ponestane memorije, bit cepozvan garbage collector koji ce osloboditi svu memoriju koju su zauzimali oni objekti na koje višene postoje reference. Prije no što objekt bude uništen, on je finaliziran. Slijedi primjer definiranjarazreda GeometrijskiLik:

Example 2.3. Razred GeometrijskiLikOvaj razred daje osnovan opis bilo kojeg geometrijskog lika. Ima svoje ime, koje cuva u privatnojvarijabli koja je po tipu String, nad kojom odmah definira i javnu metodu za dohvat tog imena (getter,engl.). Takoder, definira i svoj konstruktor, cijim pozivanjem se stvara instanca tog razreda, tj. objekt.Ovaj razred definira i dvije metode, od kojih jedna služi za dohvat opsega, a druga za dohvat površinetog geometrijskog lika.

20

Page 26: Skripta iz Jave

Razrediiob-jekti

public class GeometrijskiLik {/** Privatni element koji pohranjuje ime lika */private String ime;

/** Konstruktor geometrijskog lika */public GeometrijskiLik(String ime) {this.ime = ime;}

/** Dohvat imena geometrijskog lika */public String getIme() {return this.ime;}

/** Dohvat opsega geometrijskog lika */public double getOpseg() {return 0.0;}/** Dohvat površine geometrijskog lika */public double getPovrsina() {return 0.0;}

}

Primjer stvaranja primjerka tog razreda:

GeometrijskiLik lik1 = new GeometrijskiLik("Lik1");

Varijabla lik1 je po vrsti referenca (slicno kao pokazivac u C-u). Operator new alocira u memorijimjesto za jedan primjerak razreda i zatim zove odgovarajuci konstruktor koji ce inicijalizirati objekt.Rezultat tih operacija je vracanje reference na novi objekt. U Javi ne postoje pokazivaci u onomsmislu kako smo ih definirali u C-u, niti je korisniku dopušteno da sam odlucuje "gdje" ce i "koliko"memorije zauzeti. Java sama vodi racuna o zauzimanju i oslobadanju memorije, te je time aliminiranamogucnost grešaka koje su se znale dogadati kada je korisnik pokušao pisati po dijelovima memorijekoji mu nisu bili na raspolaganju.

Primjeri uporabe razreda GometrijskiLik

Example 2.4. Uporaba razreda GeometrijskiLikU main metodi sljedeceg razreda stvaraju se dva primjerka razreda GeometrijskiLik (lik1 i lik2), te sena zaslon ispisuju njihova imena pozivanjem metode getIme().

21

Page 27: Skripta iz Jave

Razrediiob-jekti

class Primjer1 {public static void main(String[] args) {

GeometrijskiLik lik1 = new GeometrijskiLik("Lik1");GeometrijskiLik lik2 = new GeometrijskiLik("Lik2");System.out.println("Ime prvog lika je "+lik1.getIme());System.out.println("Ime drugog lika je "+lik2.getIme());

}}

Ispis:

Ime prvog lika je Lik1Ime drugog lika je Lik2

Što ako želimo definirati razred koji ce opisivati liniju? Linija je takoder geometrijski lik, no da bi jedefinirali trebaju nam i koordinate pocetka i kraja. Ovaj razred cemo definirati tako što cemo reci daLinija nasljeduje (extends) osobine i metode koje posjeduje razred GeometrijskiLik, te mu dodati oneosnovne osobine da bi primjerak tog razreda tocno definirao liniju.

Example 2.5. Implementacija razreda Linija kao posebne vrste geometrijskoglika:Nakon što pri deklaraciji razreda Linija definiramo da se nasljeduje rezred GeometrijskiLik, ovomrazredu je automatski dodijeljena varijabla ime te metode getOpseg() i getPovrsina(). Poredtoga, mi sami definiramo jos dva para varijabli koje ce nam služiti za definiranje pocetka i kraja linije.U konstruktoru ovog razreda primamo cetiri numericke vrijednosti koje postavljamo kao koordinatepocetne i završne tocke, te pozivamo konstruktor od razreda GeometrijskiLik super("Linija")koji ce postaviti ime ovog razreda na vrijednost predanog Stringa. Nadalje implementiramo metode zadohvat privatnih vrijednosti ovog razreda (engl. getter). Ocito je da linija kao geometrijski lik nemapovršinu niti opseg, pa te metode nije potrebno mijenjati.

22

Page 28: Skripta iz Jave

Razrediiob-jekti

class Linija extends GeometrijskiLik {/** X koordinata pocetka linije. */private int x0;/** Y koordinata pocetka linije. */private int y0;/** X koordinata kraja linije. */private int x1;/** Y koordinata kraja linije. */private int y1;/*** Konstruktor linije

*/public Linija(int x0, int y0, int x1, int y1) {super(“Linija”); // Poziv konstruktora od geom. likathis.x0 = x0;this.y0 = y0;this.x1 = x1;this.y1 = y1;

}/*** Dohvat X-koordinate pocetka linije

*/public int getX0() {

return x0;// isto sto i: return this.x0;}

// ostale metode...}

Nakon što smo implementirali razred Linija kao posebnu vrstu geometrijskog lika, moža bismo htjeliisto uciniti i za pravokutnik? Pravokutnik je geometrijski lik sa površinom, opsegom, te eventualnomdefinicijom jedne njegove tocke u koordinatnom sustavu.

Example 2.6. Pravokutnik je poseban geometrijski lik:Opet pri deklaraciji razreda kažemo da ovaj razred nasljeduje GeometrijskiLik, te dodatno definiramojoš cetiri privatne varijable, od kojih ce dvije definirati gornji lijevi vrh pravokutnika, a druge dvijepravokutnikovu širinu i visinu. Pošto pravokutnik ima i opseg i površinu, potrebno je te metode(definirane u razredu GeometrijskiLik) ovdje promijeniti (engl. override). Modifikacija se vrši takoda se metoda deklarira identicno kao i u nadrazredu, te se implementira ona funkcionalnost koja ceosigurati smislenost vracenih vrijednosti. U konstruktoru ovog razreda primamo cetiri numerickevrijednosti koje postavljamo kao koordinate pocetne tocke te širinu i visinu, te pozivamo konstruktorod razreda GeometrijskiLik super("Pravokutnik") koji ce postaviti ime ovog razreda navrijednost predanog Stringa. Nadalje implementiramo metode za dohvat privatnih vrijednosti ovograzreda

23

Page 29: Skripta iz Jave

Razrediiob-jekti

class Pravokutnik extends GeometrijskiLik {/** X koordinata gornjeg lijevog vrha. */private int vrhX;/** Y koordinata gornjeg lijevog vrha. */private int vrhY;/** Sirina pravokutnika. */private int sirina;/** Visina pravokutnika. */private int visina;/*** Dohvat X-koordinate gornjeg lijevog vrha

*/public int getVrhX() {

return vrhX;}

/*** Konstruktor pravokutnika.

*/public Pravokutnik(

int vrhX, int vrhY, int sirina, int visina) {

super("Pravokutnik"); // Poziv konstruktora od g. likathis.vrhX = vrhX;this.vrhY = vrhY;this.sirina = sirina;this.visina = visina;}

/*** Izracun opsega pravokutnika; ova metoda prekriva

* istu metodu definiranu u razredu GeometrijskiLik

*/public int getOpseg() {

return 2*sirina + 2*visina;}/*** Izracun površine pravokutnika; ova metoda prekriva

* istu metodu definiranu u razredu GeometrijskiLik

*/public int getPovrsina() {

return sirina*visina;}

}

Java razred ObjectJava definira razred Object kojeg svaki razred u Javi implicitno nasljeduje i ji ima niz metoda. Sljedecesu nam od posebnog interesa:

• Object(); - konstruktor bez argumenata, služi stvaranju instance tog razreda

24

Page 30: Skripta iz Jave

Razrediiob-jekti

• void finalize() throws Throwable; - finalizator, metoda koja se poziva neposredno prije pozivagarbage collector-a

• int hashCode(); - metoda koja racuna hash vrijednost nekog razreda, treba je implementirati natakav nacin da je osiguran velik stupanj rasipanja za slicne objekte

• boolean equals(Object o); - metoda kojom se primjerak trenutnog objekta usporeduje s nekimdrugim objektom

• String toString(); - vraca tekstualni opis objekta

Sada je potrebno razred GeometrijskLik proširiti metodama equals() i toString().

Example 2.7. Dopuna razreda GeometrijskiLikPrvo se pitamo da li je predani objekt primjerak (instanca) razreda GeometrijskiLik, za ovo koristimokljucnu rijec instanceof. Nakon toga je potrebno stvoriti primerak razreda GeomtrijskiLik te cast-ati predani objekt u taj razred. Tek nakon toga se provjerava da li trenutni objekt i predani imaju istoime, što smo definirali kao istovjetnost dva primjerka ovog razreda.

public boolean equals(Object obj) {if( !(obj instanceof GeometrijskiLik) ) return false;GeometrijskiLik drugi = (GeometrijskiLik)obj;return ime.equals(drugi.ime);

}public String toString() {

return “Lik “+ime;}

Sada je potrebno nadopuniti i razred Linija istim metodama. Unutar metode eqauls() ovograzreda, poziva se i super.equals(), koja ce nam vratiti vrijednost false samo ukoliko imenadvaju primjeraka nisu ista. Metodu toString() definiramo pozivom iste metode nadrazreda tedodavanjem ispisa ostalih elemenata ovog razreda.

Example 2.8. Dopuna razreda Linija

public boolean equals(Object obj) {if( !(obj instanceof Linija) ) return false;Linija druga = (Linija)obj;if(!(super.equals(druga))) return false;return x0==druga.x0 && y0==druga.y0 &&x1==druga.x1 && y1==druga.y1;

}

public String toString() {return super.toString() +

“(“+x0+”,” +y0+”,”+x1+”,” +y1+”)”;}

Na isti nacin cemo proširiti i razred Pravokutnik.

25

Page 31: Skripta iz Jave

Razrediiob-jekti

Example 2.9. Dopuna razreda Pravokutnik

public boolean equals(Object obj) {if( !(obj instanceof Pravokutnik) ) return false;Pravokutnik drugi = (Pravokutnik)obj;if(!(super.equals(drugi))) return false;return vrhX==drugi.vrhX && vrhY==drugi.vrhY &&sirina==drugi.sirina && visina==drugi.visina;

}

public String toString() {return super.toString() +“(“+vrhX+”,” +vrhY+”,” +sirina+”,” +visina+”)”;}

Slijedi nekoliko primjera uspredivanja objekata.

Example 2.10. Primjer usporedbe objekataI linija i pravokutnik su geometrijski likovi, a pošto naši razredi Lnija i Pravokutnik nasljeduju razredGeometrijskiLik, mi ih mozemo spremati u varijablu definiranu kao Geometrijski lik, pozivajucikonstruktore samih razreda. Isto tako smo mogli umjesto

class Primjer2 {public static void main(String[] args) {GeometrijskiLik lik1 = new Pravokutnik(1,1,5,5);GeometrijskiLik lik2 = new Pravokutnik(1,1,5,5);

System.out.println(“lik1: ”+lik1.toString());System.out.println(“lik2: ”+lik2);System.out.println(“lik1==lik2 ”+(lik1==lik2));System.out.println(“lik1.equals(lik2) ”+lik1.equals(lik2));

}}

Ispis za gornji kod izgleda ovako:

lik1: Pravokutnik(1,1,5,5)lik2: Pravokutnik(1,1,5,5)lik1==lik2 falselik1.equals(lik2) true

Zasto je operator ekivalencije za dva, po definiciji jednaka primjerka razreda Pravokutnik, vratio false?Treba imati na umu da su lik1 i lik2 reference, a pošto se svakim pozivom konstruktora stvara noviobjekt, a time i njegova referenca, one su jedinstvene. No metoda equals() ce vratiti true, iz razlogašto su sve osobine ta dva objekta potpuno jednake, po onim kriterijima koje smo zadali prilikomimplementacije te metode.

26

Page 32: Skripta iz Jave

Razrediiob-jekti

Example 2.11. Primjer usporedbe StringovaKako usporedujemo Stringove?

class Primjer3 {public static void main(String[] args) {String s1 = new String("Ovo je tekst.");String s2 = new String("Ovo je tekst.");System.out.println("s1==s2 "+(s1==s2));System.out.println("s1.equals(s2) "+s1.equals(s2));

}}

Ispis za gornji kod izgleda ovako:

s1==s2 falses1.equals(s2) true

Ocekivano, rezultat usporedbe je false kad smo Stringove usporedivali operatorom ekivalencije, jer seradi o dvije razlicite reference. Metda equals() ne usporeduje reference, vec je u razredu Stringuoverride-ana tako da usporeduje vrijednosti (dakle, tekst, znak po znak).

Example 2.12. Kvadrat je poseban geometrijski lik:Kvadrat je poseban oblik pravokutnika. Pri deklaraciji ovog razreda kažemo da razred nasljedujePravokutnik, a ne GeometrijskiLik, pošto sve što vrijedi za kvadrat vec imamo definirano uPravokutniku. Konstruktor ovog razreda definiramo kao metodu koja prima tri argumenta; dvavrha i jednu stranicu, te dobivene argumente proslijedujemo u konstruktor Pravokutnika (pozivsuper("Kvadrat", vrhX, vrhY, stranica, stranica);).

27

Page 33: Skripta iz Jave

Razrediiob-jekti

public class Kvadrat extends Pravokutnik {/*** Konstruktor kvadrata.

*/public Kvadrat(int vrhX, int vrhY, int stranica) {super("Kvadrat", vrhX, vrhY, stranica, stranica);}

/*** Metoda za usporedbu kvadrata.

* @return true ako su kvadrati jednaki, inace false

*/public boolean equals(Object obj) {if (!(obj instanceof Kvadrat))return false;Kvadrat drugi = (Kvadrat) obj;return super.equals(drugi);}

/*** Vraca tekstualni prikaz ovog kvadrata.

* @return tekstualni prikaz

*/public String toString() {

return "Kvadrat" + "(" + super.getVrhX() + "," + super.getVrhY() + ","+ super.getSirina() + ")";}

}

No u razredu Pravokutnik ocito ne postoji konstruktor koji prima 5 argumenata, a mi se moramoosigurati da ime novog objekta bude Kvadrat, a ne Pravokutnik. Potrebno je napraviti dodatankonstruktor u razredu Pravokutnik, koji ce umjesto fiksne vrijednosti, kao ime objekta moci postavitiproizvoljan, predani String. Pošto taj konstruktor ima smisla samo kad se poziva iz razreda Kvadrat,potrebno je dodati mu modifikator protected. Konstruktor treba izgledati ovako:

/*** Zasticeni konstruktor pravokutnika. Sluzi kao potpora za

* razrede koji nasljeduju ovaj razred i zele definirati svoje

* vlastito ime.

*/protected Pravokutnik(

String ime, int vrhX, int vrhY, int sirina, int visina

) {super(ime); // Poziv konstruktora od g. likathis.vrhX = vrhX;this.vrhY = vrhY;this.sirina = sirina;this.visina = visina;}

Na ovaj nacin ce svaki razred koji nasljeduje razred Pravokutnik moci postaviti svoje ime.

28