You are on page 1of 77

Objektno orijentisano

programiranje
vebe as 04

Biljana Stojanovi
Staa Vujii
Osnovni pojmovi.
Podseanje.
Objekat integralna celina podataka i
procedura za rad sa njima.
OOP programska paradigma zasnovana na
skupu objekata koji dejstvuju meusobno.
Glavne obrade se zasnivaju na manipulisanju
objektima.
Osnovni pojmovi.
Podseanje.
Klasa Skup objekata sa zajednikim
svojstvima. Npr. prevozno sredstvo je klasa.
Potklasa klasa koja nasleuje sve osobine
roditeljske klase (nadklase) i ima dodatnu
specijalizaciju. Npr. automobil ima sve
karakteristike klase prevozno sredstvo, ali
ima i svoje dodatne karakteristike npr. 4
toka...
Osnovni pojmovi.
Podseanje.
Instanca konkretan objekat iz klase.
Instancne promenljive ili atributi klase
parametri koji definiu objekat neke klase.
Mogu biti osnovni tipovi podataka ili objekti
neke druge klase.
Npr. automobil:
boja: bela, crvena, crna,...
proizvoa: Honda, Opel, BMW, ...
model: limuzina, sportski, karavan...
Osnovni pojmovi.
Podseanje.
Primer:
class Krug { klasa Krug
int x, y;
float r;
}
Krug k = new Krug(10,20,5); instanca klase Krug
x, y i r su instancne promenljive koje u
instanci k imaju redom vrednosti 10, 20 i 5.
Osnovni pojmovi.
Podseanje.
Klasa pored kolekcije podataka specifikuje i
ta sve moe da se radi sa objektima te
klase. Definie listu moguih operacija nad
objektima klase. To se postie blokom
programskog koda koji se naziva metoda.
Na primer:
Startuj motor
Zaustavi auto
Ubrzaj...
Osnovni pojmovi.
Podseanje.
Metod funkcija koja je sastavni deo
objekta, tj. postupak kojim se realizuje poruka
upuena objektu.
Poruka skup informacija koji se alje
objektu. Sastoji se od adrese objekta
primaoca poruke i saoptenja u kome mu se
kazuje ta treba da uradi.
Klase u Javi
Klasa se moe shvatiti i kao novi tip.
Definicija klase se koristi da se kreiraju
objekti tog klasnog tipa, tj. da se kreiraju
objekti koji sadre sve komponente koje su
specifikovane u klasi.
Klase u Javi
Definicija klase u sebi sadri:
atribute ovo su promenljive koje obino
razlikuju jedan objekat klase od drugog
metode oni definiu operacije koje moemo
da radimo za datu klasu odreuju ta
moemo da radimo nad objektima klase ili sa
objektima klase. Obino se izvravaju nad
atributima klase.
Definicija klase u Javi
Kada kreiramo objekat, on e sadrati sve
atribute koji se nalaze u definiciji klase.
Atributi klase mogu biti primitivnog tipa ili
mogu da referiu na objekte proizvoljnog
klasnog tipa, ukljuujui i onaj koji
definiemo.

Atributi u definiciji klase
Postoje 2 vrste atributa:
Statiki ili klasni atribut on je zajedniki za
sve objekte klase. Postoji samo jedna kopija tog
atributa bez obzira na to koliko objekata te klase
je kreirano i ta kopija postoji ak i kada nije
kreiran nijedan objekat te klase. Deklariu se
kljunom reju static.
Nestatiki atribut ili instancna promenljiva -
svaki objekat klase poseduje svoju sopstvenu
kopiju atributa. Ovakvi atributi daju objektima
individualnost, tj. razlikuju ih meusobno.
Statiki atributi
Statiki atributi obino opisuju neko svojstvo
koje je zajedniko za sve objekte te klase.
Jo jedna primena statikih atributa je za
uvanje vrednosti koje su zajednike svim
objektima te klase.
Npr: ako elimo da brojimo koliko je objekata
neke klase kreirano u programu, najbolje
reenje je da se za to iskoristi statika
promenljiva, zato to ona moe da se koristi i
kada nijedan objekat klase nije kreiran.
Statiki atributi
Metodi u definiciji klase
Analogno atributima, postoje dve vrste
metoda:
Statike ili klasne metode mogu da se
izvravaju i kada ne postoji nijedan objekat klase.
Deklariu se kljunom reju static .
Nestatike ili instancne metode mogu se
izvravati samo u odnosu na objekat.
Statiki metodi
Poto statiki metodi mogu da se izvravaju i
kada ne postoje objekti, oni ne mogu da
referiu na instancne promenljive, jer u
suprotnom moe da doe do toga da se
operie nad promenljivim koje ne postoje. U
tom sluaju, kd se nee prevesti, dobie se
poruka o greci.
Metod main() je, kao to smo videli ranije,
uvek deklarisan kao statiki. Pre nego to
neka aplikacija pone da se izvrava, ne
postoji ni jedan objekat. Da bismo startovali
izvravanje, neophodan nam je metod koji
moe da se izvri ak i kada nema objekata,
dakle, statiki metod.
Statiki metodi
Pored main() metoda, verovatno najea
situacija kada koristimo statike metode je
kada se klasa koristi kao kontejner za
gomilu korisnih metoda (npr. matematike
funkcije implementirane kao klasne metode
u standardnoj klasi Math ove metode
nemaju nikakve veze sa objektima, ve
samo operiu nad primitivnim tipovima, a
sadre i neke klasne promenljive koje su
zapravo korisne matematike konstante
pi, e, itd. )

Napomena!
Iako se instancne metode vezuju za objekat,
u memoriji postoji samo jedna kopija svake
instancne metode koju dele svi objekti
odgovarajue klase, jer bilo bi jako skupo da
se za svaki novi objekat kreira i nova kopija
instancne metode. Poseban mehanizam
omoguava da svaki put kada se pozove
metod, njegov kd se izvrava na nain
specifian za konkretan objekat.
Pristup statikim lanovima
klase
Obino promenljivim i metodama koje su
definisane u klasi pristupamo izvan nje.
Statikom lanu klase pristupamo koristei
ime klase . ime lanice
Double koren = Math.sqrt(Math.PI);
Pristup statikim lanovima
klase
Statikom lanu se moe pristupiti i preko
promenljive koja referie na konkretan objekat klase.
referenca na objekat.ime lanice
Ovo je mogue jer svaki objekat uvek ima pristup
svim statikim lanovima klase.
Takoe, mogu se import naredbom ukljuiti imena
statikih lanova klase (atributa i metoda) i moe se
kasnije referisati na njih bez kvalifikovanja njihovih
imena.
Pristup nestatikim lanovima
klase
Instancnim promenljivim i metodima se
pristupa referenca na objekat.ime lanice:
Double povrsinaKupe = kupa.povrsina();
Klase u Javi
Za definisanje klase koristimo kljunu re
class koju prati ime klase i u okviru vitiastih
zagrada detalji definicije.
class ImeKlase {
// lanovi ( atributi i metodi )
}
Po konvenciji, imena klasa u Javi poinju
velikim slovima.
Definisanje klase
Za atribute, kako statike tako i nestatike, se
u definiciji klase mogu postaviti inicijalne
vrednosti.
Ukoliko se ne navede inicijalna vrednost,
prilikom kreiranja objekta bie pridruena
default vrednost i to:
0 za numerike tipove
'\u0000' za tip char
null za reference na objekte i reference na nizove
Definisanje metoda
Metodi su zapravo funkcije i tako se i
definiu.
Tip vrednosti koju metod vraa moe biti
void, proizvoljan tip ili klasa.
Lokalne promenljive se ne inicijalizuju
automatski, ve se mora eksplicitno izvriti
njihova inicijalizacija (inae ne prolazi
kompajliranje).
Definisanje metoda
Metodama se argumenti prenose po
vrednosti.
Dakle, za svaki argument koji se prenosi,
pravi se njegova kopija i kopija se prenosi
metodu preko imena parametra, a ne
originalna vrednost, pa tako ako je argument
promenljiva primitivnog tipa, funkcija ne moe
promeniti njenu vrednost.


Prenoenje argumenata
metodima
Iako se mehanizam prenoenja argumenata
po vrednosti primenjuje na sve tipove
argumenata, efekat za objekte se razlikuje od
onog za promenljive primitivnih tipova.
Objekat se moe promeniti jer promenljiva
klasnog tipa sadri referencu na objekat, a ne
sm objekat. Kada se takva promenljiva
prenese kao argument metoda, prenosi se
kopija reference na objekat, a ne kopija
samog objekta.
Final parametri
Svaki parametar metoda moe se navesti i
kao final ime se spreava da funkcija
promeni njegovu vrednost, o emu e
kompajler voditi rauna.
Poto se parametri prenose po vrednosti,
final ima smisla samo za parametre koji su
reference na objekte klasa.
Meutim, time se spreava promena
reference na objekat koja se prosleuje
metodu, a ne samog objekta.
Definisanje statikih metoda
Doda se kljuna re static ispred definicije
metoda.
Vano je zapamtiti da se unutar statikih
metoda ne mogu referisati nestatiki atributi,
jer se ovakvi metodi mogu pozivati i kada nije
kreiran nijedan objekat klase, u kom sluaju i
ne postoji nijedan nestatiki atribut.
Promenljiva this
Svaki nestatiki metod ima promenljivu koja
se zove this koja predstavlja referencu na
tekui objekat za koji je metod pozvan.
Kompajler implicitno koristi this kada metod
referie nestatiki atribut klase.
Moemo i sami napisati this.atribut.
Nije dobra praksa na taj nain nepotrebno
optereivati kod. Meutim, postoje i situacije
kada je neophodno eksplicitno koristiti this.
Primer
Kada izvrimo naredbu:
double ballVolume = ball.volume();
gde je ball objekat odgovarajue klase, this u
metodu volume() referisae na objekat ball,
tako da e upravo instancna promenljiva
radius iz objekta ball biti iskoriena u
izraunavanju.

this i nestatiki metodi
Kako postoji samo jedna kopija nestatikog
metoda u memoriji, bez obzira na to koliko
objekata date klase postoji, promenljiva this
omoguuje da ta jedna instanca metoda radi
sa razliitim objektima klase.
Prilikom svakog poziva nestatikog metoda,
promenljiva this se postavi da referie na
objekat za koji je metod pozvan i onda se kd
u metodu odnosi na lanove upravo tog
objekta.
Eksplicitna upotreba this-a
Imena promenljivih koje se deklariu unutar
metoda, lokalna su za taj metod. Dozvoljeno
je koristiti imena lokalnih promenljivih, kao i
imena parametara metoda koja su ista kao i
imena atributa. U tom sluaju, neophodno je
koristiti this za referisanje lana klase unutar
metoda. Smo ime promenljive e se uvek
odnositi na lokalnu promenljivu metoda, ne na
atribut klase.
Primer
void changeRadius( double radius ){
this.radius = radius;
}
this.radius se odnosi na atribut klase, a
radius na parametar metoda
Inicijalizacija atributa klase
I statiki i nestatiki atributi se mogu
inicijalizovati unutar definicije klase.
Neke stvari se ne mogu inicijalizovati jednim
izrazom, npr. veliki niz koji elimo
inicijalizovati vrednostima koje iziskuju neku
vrstu izraunavanja.
To je posao za inicijalizacioni blok.
Korienje inicijalizacionih blokova
Inicijalizacioni blok je blok kda izmeu { i }
koji se izvrava pri kreiranju objekta klase
Postoje dve vrste inicijalizacionih blokova:
Statiki blok za inicijalizaciju blok definisan
kljunom reju static i izvrava se samo jednom
kada se klasa uitava. On moe da inicijalizuje
samo statike atribute klase.
Nestatiki blok za inicijalizaciju izvrava se
za svaki objekat koji se kreira i stoga moe da
inicijalizuje instancne promenljive u klasi.
Iako je mogue, normalno ne treba inicijalizovati
statike atribute nestatikim inicijalizacionim
blokom.

Konstruktori
Moemo imati vie inicijalizacionih blokova i
onda se oni izvravaju onim redom kojim su
navedeni u definiciji klase.
Iako su inicijalizacioni blokovi korisni, za
kreiranje objekata potrebni su nam i
konstruktori.
Konstruktori
Uvek kada kreiramo objekat neke klase
poziva se specijalna vrsta metoda, tzv.
konstruktor.
Ukoliko ne definiemo nijedan konstruktor za
nau klasu, kompajler e obezbediti
podrazumevani konstruktor klase koji ne radi
nita.
Konstruktori
Primarna svrha konstruktora jeste da za
objekat koji se kreira izvri inicijalizaciju
nestatikih atributa.
Inicijalizacioni blokovi koji su eventualno
definisani u klasi uvek se izvravaju pre tela
konstruktora.
Konstruktor ima 2 specifine osobine:
nikada ne vraa vrednost ( ni void! )
uvek ima isto ime kao i klasa kojoj pripada
Konstruktori
Konstruktor moe imati proizvoljan broj
parametara, ukljuujui i 0 ( bez parametara ).
Podrazumevani konstruktor nema parametre.
Podrazumevani konstruktor
ime_klase()
{}
Podrazumevani konstruktor nema
parametre i ne radi nita.
Konstruktor se poziva kad god kreiramo
objekat.
Ukoliko sami napiemo bar jedan
konstruktor, kompajler ne pravi
podrazumevani konstruktor. Ako nam je i on
potreban, moramo ga eksplicitno definisati .
Kreiranje objekata klase
Kada deklariemo promenljivu tipa neke
klase, ne poziva se konstruktor, jer se i ne
kreira objekat.
Npr.
Sfera ball; // Deklarisanje promenljive
Na ovom mestu kreira se promenljiva ball
koja moe da uva referencu na objekat tipa
Sfera, ako i kada kreiramo neki.
Kreiranje objekata
Da bismo kreirali objekat klase moramo koristiti
kljunu re new za kojom sledi poziv konstruktora
Da inicijalizujemo ball referencom na objekat:
ball = new Sphere(10.0, 1.0, 1.0, 1.0);
Moe i sve u jednom redu:
Sphere ball = new Sphere(10.0, 1.0, 1.0, 1.0);
// deklarie se promenljiva ball i definie objekat
// na koji ona referie
Klase u Javi
ivotni vek objekata
ivotni vek objekta odreen je promenljivom
koja uva referencu na njega, pod
pretpostavkom da postoji samo jedna takva.
Objekat na koji promenljiva referie umire
kada se izae iz opsega te promenljive, a to
je na kraju bloka u kome je deklarisana.
Ako postoji vie promenljivih koje referiu
isti objekat, objekat postoji sve dok postoji
bar jedna od tih promenljivih.
ivotni vek objekata
Sa ball = null; resetujemo promenljivu tako
da vie ne pokazuje na objekat. Ukoliko je to
bila jedina promenljiva koja je referisala na taj
objekat, on e biti uniten. Promenljiva ball,
meutim nastavlja da postoji i moe se
koristiti da referie na neki drugi objekat iste
klase.
Garbage collector
Unitavanje mrtvih objekata vri tzv. Garbage
Collector. To se u Javi deava automatski, ali ne
znai da mrtvi objekti odmah nestaju iz memorije. To
ni na koji nain ne utie direktno na na program.
Moe da bude bitno jedino u situacijama kada su
nai objekti ogromni ili kada odjednom kreiramo i
osobaamo se velikog broja objekata. U tom sluaju
moemo probati da zovemo statiki metod gc() klase
System da bi Java VM izvrila garbage collection
System.gc();
Meutim, poziv gc-a moe i da pogora stvar i da
uspori ceo taj proces.
Preklapanje (overloading)
metoda
Mogue je definisanje vie metoda klase sa
istim imenom i jedinstvenim skupom
parametara. To se naziva preklapanjem
metoda.
Ime metoda, zajedno sa tipovima njegovih
parametara ini potpis metoda.
Preklapanje (overloading)
metoda
Potpis svakog metoda u klasi mora biti razliit
kako bi kompajler mogao u svakom trenutku
da odredi koji metod pozivamo.
Tip povratne vrednosti metoda nema uticaja
na potpis metoda.
Preklapanje konstruktora
Konstruktori se mogu preklapati, kao i bilo
koji drugi metod klase.
Kompajler odabira koji konstruktor e koristiti
na osnovu prosleenih argumenata.
Za potpis metoda bitan je broj i tip
parametara, a ne njihova imena.
Poziv konstruktora iz drugog
konstruktora
Jedan konstruktor klase moe pozivati drugi
konstruktor te klase u svojoj prvoj izvrnoj
naredbi. Time se esto moe utedeti na
ponovnom pisanju koda.
Za referisanje drugog konstruktora iste klase
koristi se this kao ime metoda praen
odgovarajuim argumentima izmeu
zagrada.
Kompajliranje i pokretanje programa
iz paketa (iz komandne linije )
Napravi se direktorijum, npr. Ucenik" i u njega se
smeste .java fajlovi, npr. Ucenik.java i TestUcenik.java.
Na poetku svakog java fajla mora da se navede
direktiva package Ucenik; // paket mora da se zove kao
i direktorijum
Neka je putanja direktorijuma npr. P:\OOP\Ucenik
Kompajlira se tako to se putanja direktorijuma navede
kao tekui direktorijum i kuca:
javac -cp P:\OOP" TestUcenik.java
U direktorijumu Ucenik se generiu fajlovi Ucenik.class i
TestUcenik.class.
Onda se vrati korak nazad sa cd .. pa se za pokretanje
kuca
java -cp . Ucenik.TestUcenik
Kompajliranje i pokretanje programa
iz paketa (iz komandne linije )
Napomena studentima koji imaju vebe u Sali
2 u Jagievoj!
Stavljajte sve java fajlove u direktorijum bin i
na poetku svakog navedite package bin;
Pri kompajliranju umesto da navodite svaki
fajl zasebno izvrite kompajliranje svih
odjednom navodei *.java!
Zadatak 1. Ucenik.java
package Ucenik;
class Ucenik {
String ime;
String skola;
int razred;

// Konstruktor sa argumentima
Ucenik(String ime_uc, String skola_uc, int
razred_uc){
ime=ime_uc;
skola=skola_uc;
razred=razred_uc;
}

// Default konstruktor
/* Ucenik(){
ime="Novak Novicic";
skola="Vuk Stefanovic Karadzic";
razred=3;
} */

// Metod za ispis skole
void stampajSkolu(){
System.out.println("Ime skole je: "+skola);
}


// Metod za ispis imena ucenika
void stampajIme(){
System.out.println("Ime ucenika je: "+ime);
}
}

TestUcenik.java
package Ucenik;

class TestUcenik {

public static void main (String args []){

Ucenik prvi=new Ucenik("Milos Milosevic","Ivan
Goran Kovacic",7);
prvi.stampajSkolu();
prvi.stampajIme();

System.out.println("Ucenik "+prvi.ime+" ide u
"+prvi.razred +". razred skole "+ prvi.skola);

/* Ucenik drugi=new Ucenik();
System.out.println("Ucenik "+drugi.ime+" ide u
"+drugi.razred +". razred skole "+ drugi.skola);
*/
}
}
Zadatak 2.
Napisati u paketu Sfera klasu Sfera.java takvu da sadri:
Klasnu promenljivu PI sa fiksiranom vrednou.
Klasnu promenljivu koja broji objekte klase.
Instancne promenljive: poluprecnik i koordinate centra
(xCentar, yCentar i zCentar).
Konstruktor jedinine sfere u koordinatnom poetku.
Konstruktor jedinine sfere u zadatoj taki.
Konstruktor sfere zadatog poluprenika u zadatoj taki.
Statiki metod koji vraa ukupan broj kreiranih objekata
klase.
Instancni metod za raunanje zapremine lopte.

Napisati u paketu Sfera klasu TestSfere.java
takvu da da sadri:
Ispis broja objekata koji su formirani (pozivom
odgovarajueg metoda) pre nego to je formiran ijedan
objekat.
Kreira objekte
sfera u koordinatnom poetku, poluprenika 4.0.
globus (12., 1.0, 1.0, 1.0)
bilijarska_lopta (10.0, 10.0, 0.0)
Jedinina sfera neparna u koordinatnom poetku
Ispis broja objekata koji su formirani.
tampa zapreminu svake od lopti.
Zadatak 2. Sfera.java
package Sfera;
/*
* Rad sa klasom Sfera, overloading konstruktora,
* staticke i instancne promenljive,
* staticki i instancni metodi.
*/
class Sfera
{
static final double PI = 3.14; // Klasna promenljiva sa fiksiranom
vrednoscu
static int broj = 0; // Klasna promenljiva koja broji objekte klase

// Instancne promenljive
double poluprecnik;
double xCentar;
double yCentar;
double zCentar;

// Konstruktor jedinicne sfere u koordinatnom pocetku
Sfera()
{
poluprecnik = 1.0;

// Ostali clanovi klase bice postavljeni na 0 po defaultu

// Uvecavamo broj kreiranih objekata za 1
++broj;
}

// Konstruktor jednicne sfere u zadatoj tacki
Sfera(double x, double y, double z)
{
this(); // Pozivamo konstruktor bez argumenata
xCentar = x;
yCentar = y;
zCentar = z;
}

// Konstruktor sfere zadatog poluprecnika u zadatoj tacki
Sfera(double poluprec, double x, double y, double z)
{
this(x, y, z); // Pozivamo konstruktor sa 3 argumenta
poluprecnik = poluprec;
}

// Staticki metod koji vraca ukupan broj kreiranih objekata klase
static int getBroj()
{
return broj;
}

// Instancni metod za racunanje zapremine lopte
double zapremina()
{
return 4.0 / 3.0 * PI * poluprecnik * poluprecnik * poluprecnik;
}
}
Zadatak 2. TestSfere.java
package Sfera;

public class TestSfere
{
public static void main(String[] args)
{
System.out.println("Broj objekata = " + Sfera.getBroj());

Sfera sfera = new Sfera(4.0, 0.0, 0.0, 0.0);
System.out.println("Broj objekata = " + Sfera.getBroj());

Sfera globus = new Sfera(12., 1.0, 1.0, 1.0);
System.out.println("Broj objekata = " + Sfera.getBroj());

Sfera bilijarska_lopta = new Sfera(10.0, 10.0, 0.0);


Sfera neparna = new Sfera();
System.out.println("Broj objekata = " + Sfera.getBroj());
System.out.println();

// Stampamo zapreminu svake od lopti
System.out.println("zapremina lopte = " + sfera.zapremina());
System.out.println("zapremina globusa = " + globus.zapremina());
System.out.println(
"zapremina bilijarske lopte = " +
bilijarska_lopta.zapremina());
System.out.println("zapremina neparne lopte = " +
neparna.zapremina());
}
}
Zadatak 3.
Napisati u paketu Geometrija klasu
Tacka.java takvu da sadri:
Instancne promenljive, x i y koodrinata take.
Konstruktor na osnovu zadate x i y koordinate take.
Konstruktor na osnovu zadatog objekta Tacka.
Metod za pomeranje Tacke po x i y osi za x_pomeraj,
y_pomeraj.
Metod za raunanje rastojanja do zadate take.



Napisati u paketu Geometrija klasu Duz.java takvu
da sadri:
Instancne promenljive, poetna i krajnja taka dui.
Konstruktor na osnovu zadate poetne i krajnje take dui.
Konstruktor na osnovu zadate x i y koordinate poetne take i x i
y koordinate krajnje take.
Metod za raunanje duine dui.
Metod za odreivanje preseka dveju dui, zadatih
parametarski:
x=x_pocetak+(x_kraj-x_pocetak)*t
y=y_pocetak+(y_kraj-y_pocetak)*t

Napisati u paketu Geometrija klasu
TestGeometrija.java takvu da sadri:
Kreiramo dve take (pocetak (0.0, 1.0) i kraj (5.0, 6.0)).
Kreiramo du ija su poetna i krajnja taka ba ove zadate
take.
Kreiramo drugu du sa zadatim koordinatama poetne i
krajnje take.
Ispisati koje dui su formirane.
Pomeramo taku kraj za (1.0, -5.0).
Ispisati novu du.
Metod presek se poziva za jedan objekat tipa Duz, a drugi
objekat uzima kao argument. Izraunati presek.
Zadatak 3. Tacka.java
package Geometrija;
/*
* Klasa Tacka sa svojim osnovnim metodama.
*/
class Tacka
{
// Instancne promenljive, x i y koodrinata tacke
double x;
double y;

// Konstruktor na osnovu zadate x i y koordinate tacke
Tacka(double x, double y)
{
this.x = x;
this.y = y;
}

/*
* Konstruktor na osnovu zadatog objekta Tacka
* Kljucna rec final oznacava da se argument
* nece menjati u okviru metoda
*/
Tacka(final Tacka tacka)
{
x = tacka.x;
y = tacka.y;
}

// Metod za pomeranje Tacke po x i y osi
void pomeri(double x_pomeraj, double y_pomeraj)
{
x += x_pomeraj;
y += y_pomeraj;
}

// Metod za racunanje rastojanja do zadate tacke
double rastojanje(final Tacka tacka)
{
return Math.sqrt( (x - tacka.x) * (x - tacka.x)
+ (y - tacka.y) * (y - tacka.y));
}

// Metod za konverziju u String
public String toString()
{
return "(" + x + ", " + y + ")";
//return "(" + Double.toString(x) + ", " + y + ")";
// return "(" + String.valueOf(x) + ", " + y + ")";
}

}
Zadatak 3. Duz.java
package Geometrija;
/*
* Klasa Duz sa svojim osnovnim metodama.
*/
class Duz
{
// Instancne promenljive, pocetna i krajnja tacka duzi.
Tacka pocetak;
Tacka kraj;

// Konstruktor na osnovu zadate pocetne i krajnje tacke duzi.
Duz(final Tacka pocetak, final Tacka kraj)
{
this.pocetak = new Tacka(pocetak);
this.kraj = new Tacka(kraj);
// this.pocetak =pocetak;
// this.kraj = kraj;
}

/*
* Konstruktor na osnovu zadate x i y koordinate pocetne tacke,
* i x i y koordinate krajnje tacke.
*/
Duz(double x_pocetak, double y_pocetak, double x_kraj, double y_kraj)
{
/*
* Kreiramo pocetnu i krajnju tacku duzi,
* na osnovu zadatih koordinata.
*/
pocetak = new Tacka(x_pocetak, y_pocetak);
kraj = new Tacka(x_kraj, y_kraj);
}

// Metod za racunanje duzine duzi.
double duzina()
{
return pocetak.rastojanje(kraj);
}



// Metod za konverziju u String.
public String toString()
{
return pocetak + ":" + kraj;
}

/*
* Metod za odredjivanje preseka dveju duzi, zadatih parametarski:
* (p): x=x_pocetak+(x_kraj-x_pocetak)*t
* y=y_pocetak+(y_kraj-y_pocetak)*t
*/
Tacka presek(final Duz prava)
{
Tacka presecnaTacka = new Tacka(0, 0);

// Odradjujemo brojilac i imenilac parametra dobijenog za presecnu tacku.
double brojilac = (this.kraj.y - this.pocetak.y) * (this.pocetak.x -
prava.pocetak.x) - (this.kraj.x - this.pocetak.x) * (this.pocetak.y -
prava.pocetak.y);

double imenilac = (this.kraj.y - this.pocetak.y) * (prava.kraj.x -
prava.pocetak.x) - (this.kraj.x - this.pocetak.x) * (prava.kraj.y -
prava.pocetak.y);

// Odredjujemo x i y koordinatu presecne tacke.
presecnaTacka.x = prava.pocetak.x + (prava.kraj.x - prava.pocetak.x)
* brojilac / imenilac;
presecnaTacka.y = prava.pocetak.y + (prava.kraj.y - prava.pocetak.y)
* brojilac / imenilac;

return presecnaTacka;
}
}
Zadatak 3.
TestGeometrija.java
package Geometrija;
/*
* Klasa TestGeometrija u kojoj se nalazi main() funkcija
* i gde testiramo nase klase Tacka i Duz.
*/
public class TestGeometrija
{
public static void main(String[] args)
{
// Kreiramo dve tacke.
Tacka pocetak = new Tacka(0.0, 1.0);
Tacka kraj = new Tacka(5.0, 6.0);
System.out.println("Kreirane su tacke " + pocetak + " i " + kraj);

// Kreiramo duz cija su pocetna i krajnja tacka
// bas ove zadate tacke.
Duz duz1 = new Duz(pocetak, kraj);

// Kreiramo drugu duz sa zadatim koordinatama
// pocetne i krajnje tacke.
Duz duz2 = new Duz(0.0, 3.0, 3.0, 0.0);
System.out.println("Kreirane su duzi " + duz1 + " i " + duz2);

// Metod presek se poziva za jedan objekat tipa Duz,
// a drugi objekat uzima kao argument.
System.out.println("Presek je " + duz2.presek(duz1));

// Pomeramo tacku kraj.
kraj.pomeri(1.0, -5.0);

System.out.println("Posle pomeranja imamo prave " + duz1 + " i " +
duz2);
System.out.println("Novi presek je " + duz1.presek(duz2));
}
}

You might also like