PROGRAMIRANJE Amir Hajdar Teme 2 Packages Reference objekata Inheritance nasljeđivanje Exceptions
Packages API Application Programmer Interface Sve klase ponuđene u sklopu Java jezika, uključujući i kompajler (npr. Math klasa, System, itd.) Klase se nalaze u raznim direktorijima Klase koje se nalaze u svakoj direktoriji pojedinačno formiraju package Ime package -a se pravi spajanjem imena direktorije počeviši od određene root direktorije Packages primjeri Package Sadržaj java.applet Klase koje implementiraju applet-e java.awt Klase sa grafiku, prozore i GUI java.awt.event Klase koje podržavaju AWT* event handling java.awt.image Klase koje podržavaju rad sa slikama java.io Klase koje podržavaju rad sa input i outputima java.lang Osnovne komande poput Math klase (uvijek uključene) java.net Klase za rad u mrežnom okruženju java.util Razne korisne klase poput Date klase *Abstract Window Toolkit
Korištenje Packages Korištenje kroz direktan poziv package -a: x = java.lang.math.sqrt(3); Korištenje kroz import : //sve klase u paketu import package.name.*; //pojedinačna klasa u paketu import package.name.class_name; Korištenje Packages java.util.date d = new java.util.date(); java.awt.point p = new java.awt.point(1,2); java.awt.button b = new java.awt.button(); ili import java.util.date; import java.awt.*; Date d = new Date(); Point p = new Point(1,2); Button b = new Button();
Kreiranje sopstvenih Packages Svaka klasa mora biti u odgovarajućoj datoteci u direktoriji koja je propisno imenovana Prva linija koda mora biti: package ime_package; Nekoliko paketa mogu biti istoj direktoriji Klase u različitim direktorijama nemogu biti u istom paketu Java reference Manipulacija objektima se vrši preko koncepta referenci Npr: class Lik { public int x; y public int y; public Lik(int x, int y){ x this.x = x; this.y = y; public int getpovrsinu() { return x * y public String tostring() { return ("duzina= " + x + ", sirina= " + y); // Lik
Java reference (jednakost) Lik b1 = new Lik(3, 4); Lik b2 = new Lik(3, 4); if(b1 == b2) { System.out.println("Likovi su jednaki"); else { System.out.println("Naravno da likovi nisu jednaki!"); 4 b1 4 b2 Odgovor? 3 3 Java reference (jednakost) Rješenje: Potrebna nam je metoda koja će provjeriti da li su im osobine jednake. public boolean jednako(lik b) { if(x == b.x && y == b.y) return true; else return false;
Java reference (jednakost) Rješenje: Lik b1 = new Lik(3, 4); Lik b2 = new Lik(3, 4); if(b1.jednako(b2)) System.out.println("Likovi su jednaki"); else System.out.println("Naravno da likovi nisu jednaki!"); Java reference (kopiranje) Lik b1 = new Lik(3, 4); Lik b2 = new Lik(5, 8); b2 = b1; Šta se desilo sa likom b2? 4 b1 8 b2 4 b1 3 5 b2 3
Java reference (kopiranje) 2 načina kopiranje: 1. način: Lik b1 = new Lik(3, 4); Lik b2 = new Lik(b1.x, b1.y); 2. način: public Lik kopija(){ return new Lik(x, y); Lik b2 = b1.kopija(); Inheritance (nasljeđivanje) Inheritance omogućuje: Prilagođavanje klasa sa specifičnu upotrebu bez potrebe da se osnovna (superclass) redefiniše Modificirana klasa (subclass) može dodati metode i redefinisati prethodno definisane Subclass može dodati varijable ali ne može promijeniti već definisane
Inheritance (nasljeđivanje) Primjer: Klasa C je subclass-a klase B: class C extends class B{... Subclass-a je specijalizacija superclass-e Superclass-a je generalizacija subclass-e Inheritance (nasljeđivanje) Pravila: Privatnim varijablama i metodama ne možemo pristupiti u subclass-ama Javne (public) varijable i metode su dostupne u subclass-ama Varijablama i metodama se može pristupiti samo ako su u istom package-u kao i klasa Varijablama i metodama definisanim kao protected mogu pristupiti samo subclass-e i nijedna druga klasa
Inheritance (nasljeđivanje) Overriding : Subclass-a ima metodu istog imena ali različitu implementaciju, a broj i tip parametara se nije primjenio Overloading : Subclass-a (ili metoda u istoj klasi) ima metodu istog imena ali je broj parametara ili tip parametara ili oboje promjenjeno Inheritance (nasljeđivanje)
Inheritance (nasljeđivanje) Pravilna upotreba: Clock NoviSat; NoviSat = new PreciseClock(3,45,30); Nepravilna upotreba: PreciseClock NoviSat; NoviSat = new Clock(3,40); Razlog: Clock objekat ne može izvršiti sve zahtjeve PreciseClock klase Inheritance (nasljeđivanje) Konstruktori (superclass i subclass) Generalno pravilo: prvo se poziva konstruktor superclass-e, a zatim subclass-e Ako superclass-a nema konstruktor bez argumenata, subclass-a mora pozvati odgovarajući konstruktor iz superclass-e Npr. class C extends B { public C( ) { //mora biti prva komanda u subclass konstruktoru!!! super(b s konstruktor parametri);
Exceptions Exceptions (izuzetak) predstavaljaju slučajeve koje se nebi smjeli desiti (npr. dijeljenje s 0-om, pristup elementu van granica niza) Neki slučajevi se nemogu izbjeći (npr. nepostojanje datoteke, nestanak mrežne konekcije, pogrešan unos podataka, itd.) Mehanizam: Komanda throw e signalizira da se exception desila i e predstavlja exception objekat Komanda try/catch omogućava metodi da uhvati ( catch ) exception objekt e i spriječi dalji problem Exceptions try/catch Primjer: void m (){ try { implementacija m metode catch (ArrayIndexOutOfBoundsException ae) { //kod koji ce rijesiti problem Metoda m će se izvršiti osim ako se exception pojavi koji signalizira da se pristupilo van dimenzije niza!
Exceptions finally Kada se pojavi exception, kontrolu preuzima catch kod Ako u kodu postoji finally implementirano, tada se ono na kraju izvršava (čišćenje urađenog) Npr.: void m() { try { open window catch (Exception e) { finally { close window Rijetko se koristi jer hvata sve moguće exceptions! Exceptions Primjer: public class A { public static void main(string[] args) { int x=integer.parseint(args[0]); System.out.println("x= " +x); Izvršenje: java A.class 1 x= 1
Exceptions Primjer (nastavak): Izvršenje: java A.class test Exception in thread "main" java.lang.numberformatexception: test at java.lang.integer.parseint(integer.java:414) at java.lang.integer.parseint(integer.java:463) at A.main(A.java:5) Exceptions Primjer: public class A { public static void main(string[] args) { try{ /* u try kodu dolazi ono što pokušavamo izvršiti i ako uspijemo idemo na finally blok, a ako ne, onda na catch kod */ int x=integer.parseint(args[0]); System.out.println("x= " +x); //kraj try bloka
Exceptions catch (NumberFormatException e) { System.out.println("Izuzetak ispisan na standardni output: " + e.getmessage()); System.err.println("Izuzetak ispisan na error output: " + e.getmessage()); e.printstacktrace(); //kraj catch bloka Exceptions finally{/* posljednje čišćenje prije prenosa kontrole toka programa na drugi dio programa */ System.out.println ("Ovo se uvijek izvrsi!"); //kraj finally bloka //nastavak main metode System.out.println("Program nastavlja dalje."); int x=integer.parseint("1234"); System.out.println("x= " +x); //kraj main metode //kraj A klase