Vjezbe 4 -OOP I
Primjer1. Kako se izvorni kod pakira?
Uzmimo primjer napravljen na predavanjima. Imamo tri izvorne
datoteke A.java, B.java i Test.java.
- Nazovimo recimo taj paket primjer1.naspaket.
- Kreiramo direktorij primjer1 i unutar njega direktorij naspaket,
kojeg također napravimo. Smjestimo A.java, B.java i Test.java u
primjer1\naspaket (ili primjer1/naspaket ako ste na
UNIX/Linux sistemu).
- Na početku kopiranih datoteka A.java, B.java i Test.java dodamo
liniju koda
package primjer1.naspaket
; .
Ovim smo kreirali
paket. Klase u paketu mogu se naći ovdje: A.java, B.java i Test.java.
Primjedba:
Ako ne specificiramo paket za našu aplikaciju, ona se nalazi u
defaultnom paketu koji nema imena.
Kako se izvorni kod iz paketa prevodi i izvršava?
- prevođenje: iz direktorija u kojem se nalazi direktorij
primjer1 izvršimo javac primjer1\naspaket\*.java
- izvršavanje: iz direktorija u kojem se nalazi direktorij
primjer1 izvršimo java primjer1.naspaket.Test.
Kako druge klase koriste kod iz klasa u paketu
primjer1.naspaket?
Postoji nekoliko načina:
- Na početku datoteke C.java dodamo import
primjer1.naspaket.*; ako želimo importirati sve klase iz paketa primjer1.naspaket.
Unutar klase C na njih referiramo njihovim
imenima npr:
import primjer1.naspaket.*;
class C{
// ...
A a =new A();
//...
}
- Na početku datoteke C.java dodamo import
primjer1.naspaket.A; ako želimo importirati samo klasu A iz paketa primjer1.naspaket?.
Unutar klase C na A referiramo kao prije
import primjer1.naspaket.A;
class C{
// ...
A a =new A();
//...
}
- Ako nema importa, onda unutar klase C na njih referiramo
njihovim
punim imenima npr:
class C{
// ...
primjer.naspaket.A a =new primjer1.naspaket.A();
//...
}
C. java nalazi se ovdje. Kopirajte je u
direktorij u kojem se nalazi primjer1. Zatim prevedite javac
C. java. Koje se greške javljaju? Popravite kod u paketu
primjer1.naspaket. Isprobajte ostale mogućnosti 1.-3. gore.
Primjer 2.
Klasa Pravokutnik
modelira pravokutnik u Kartezijevoj ravnini. Pravokutnik je potpuno
odredjen sa koordinatama donjeg lijevog vrha (x1, y1) i gornjeg
desnog vrha (x2, y2). Nekoliko detalja:
- Varijable članice klase x1, y1, x2,
y2 su deklarirane privatnima.
- Klasa sadrži metode za radi s njima: getX1, getX2,
getY1, getY2.
- Klasa ima tri konstruktora. Očigledan konstruktor jest Pravokutnik(int,
int, int, int). Ostala dva se dobiju iz ovog. Kod sadrži potrebna
objašnjenja.
- Metoda Pravokutnik unija(Pravokutnik r) pokazuje
da klasa može imati metodu čiji je povratni tip sama klasa. Ostale
interesantne detalje vezane za ovu metodu vidite u kodu.
- Kao što je objašnjeno na predavanju svaka klasa direktno ili
indirektno nasljeđuje metode iz klase java.lang.Object. Klasa
Pravokutnik je preradila metodu toString() da ispišemo objekt
na standardni output na smislen način.
- Ozbiljni nedostatak klase Pravokutnik jest da
konstruktor Pravokutnik(int x1, int x2, int y1, int y2) konstruira
objekt iako je npr x2<x1 ili y2<y1. Taj ozbiljan nedostatak je
prepušten klasi koja koristi našu klasu da sama testira: x1=<x2 i
y1=<y2).
Izuzeci će nam kasnije pomoći
da to popravimo.
Klasa PravTest:
- testira metode klase Pravokutnik.
- fiksira jedan objekt iz klase Pravokutnik (odredjen sa
(0,0) i (1,1)) a vrhove drugog kvadrata upisuje sa komandne linije
-vršimo više testova prije nego konstruiramo objekt -obratite pažnju
na smislene poruke koje ispisujem ako ne možemo konsturirati drugi
objekt
-također vidimo novi naćin za pretvaranje Stringa u integer npr. int
x1=Integer.parseInt(args[0]); Ovo je efikasnije nego
metode koje smo imali prije
- izvršite java PravTest.java s raznim vrijednostima argumenata na
komandnoj liniji da vidite što je output.
Primjer 3. Klasa PovPravokutnik proširuje
klasu Pravokutnik prerađujući metodu toString() i
dodavajući metodu povrsina. Test klasa je PovTest .
Primjer ilustrira nasljeđivanje i prerađivanje metoda; kao i kontrolu
pristupa
Primjer 4. Napišite klasu
KompleksanBroj koja zadovoljava:
- realni i imaginarni dio su deklarirane kao privatne varijable
-koriste se metode realan() i imaginaran() da se dođe do njih
- enkapsulira kompleksan broj i osnovne računske
operacije zbrajanja i množenja kompleksnih brojeva te izračunavanja
modula
- prerađena je metoda toString() iz klase Objekt koja daje
reprezentaciju kompleksng broja kao stringa
- zbrajanje i množenje je razlizirano na dva načina kao statička
metoda i kao ne statička metoda.
- Klasa KomTest testira
klasu KompleksanBroj
- paket se prevodi tako da se izvrši javac kompleksan/*.java
iz direktorija gdje se nalazi direktorij kompleksan. Program se
izvršava sa
java kompleksan/KomTest. Može i ovo java
kompleksan.KomTest
Primjer 5. Napišite klasu Pseudo
koja simulira računanje pseudo slučajnih brojeva. Ta se klasa nalazi u
paketu pseudo. Novosti u ovom programu su iduće:
- klase Pseudo sadrži unutar svoje definicije još jednu klasu
imena Test
- public static class Test {
- public static void main(String[] args) {
- //implementaciju ovdje izostavljamo jer nije
vazna
- }
- }
Takve klase nazivamo ugnježdene (eng. nested) klase. Ugnježdene klase
koje nisu deklarirane eksplicitno ili implicitno sa static
nazivaju se unutarnje klase (eng. inner). Kasnije ćemo ih sretati kod
rada sa grafičkim klasama.
- Ako prevedemo klasu Pseudo onda u direktoriju pseudo nalazimo
dvije klase
Pseudo.class i Pseudo$Test.class očiglednog
značenja. Da izvršimo klasu Pseudo na Win32 sistemu moramo izvršiti
java pseudo.Pseudo$Test. Medjutim na UNIX
ili Linux sistemu $ ima posebno značenje (koje?) pa moramo
koristiti java pseudo.Pseudo\$Test
ili java 'pseudo.Pseudo$Test'. Svaki Java program počinje
svoje izvršavanje u metodi main, a ona se nalazi u
pseudo.Pseudo$Test.
Zadaci za DZ.
- Proširite klasu Tocka iz Primjera 13 u vježbama 3 do klase Tocka1
koja prerađuje metodu toString(). Napišite i test program.
- Proširite klasu Tocka iz Primjera 13 u vjezbama 3 do klase Tocka1
koja ima konstruktor oblika Tocka1 (Tocka1 toc). To je tvz. copy
constructor.
- Proširite klasu Pravokutnik od Pravokutnik1 koji ima konstruktor
Pravokutnik1(Tocka, Tocka).
- Klasu iz Tocka.java iz Primjera 13 u vježbama 3 stavite u paket
tocka. Proširite tu klasu u istom paketu do klase Tocka1 koja ima
konstruktore: Tocka1(), Tocka1(double, double), kao i klasa Tocka, te
novi konstruktor Tocka1(double, double, String) gdje je zadnji
argument boja točke dana kao string npr. "crvena", "bijela"
itd. Dodajte i odgovarajuće metode kao za koordinate.
- Napišite klasu koje definira djelatnika u radnoj organizaciji
specificirajući njegovo ime i prezime, adresu, rang (0 ako je
djelatnik, 1 ako je voditelj), visinu plaće, te odjel u kojem radi.
Klasa mora sadržavati prerađenu metodu toString() koja mora "lijepo"
ispisivati djelatnika. Napišite i test program koji sadrži polje sa
djelatnicima i koji ih lijepo ispisuje.
- Napišite i neke druge klase za računanje slučajnih brojeva.
Pogledajte i knjigu Knuth: The art of computer programming, Volume 2.
Proučite Math.random()
iz izvornog koda u src.zip.
- Napišite apstraktnu klasu Figura koja sadrzž apstraktne metode
translatiraj() i jeliUnutra(). Preradite klasu Pravokutnik iz Primjera
1 tako
da je sada podklasa Figure. Neka su klasa Figura i Pravokutnik u
paketu figura. Dodajte u taj paket i klasu Krug koja je također
podklasa Figure tako da implementirate što je više moguće metoda
analognih onima iz klase Pravokutnik. U isti paket dodajte i klasu
Test koja testira funkcionalnost vaših klasa.
- (5) Napišite podklasu PolarKompleks koja je podklasa klase
KompleksanBroj i to tako da dodate novi konstruktor za polarne
koordinate, statičku i nestatičke metode za konverziju iz
jednog oblika u drugi, te metodu za množenje kompleksnih brojeva u
polarnom obliku. Neka se sve "kompleksne klase" nalaze u paketu polar.
Dodajte i test program koji je u defaultnom paketu.