03 Klase - Java (3)

  • Upload
    stefana

  • View
    262

  • Download
    0

Embed Size (px)

DESCRIPTION

Klase-programski jezik Java.

Citation preview

  • Objektno orijentisano programiranje 2

    Klase i objekti

  • 20.02.2013.Klase i objekti2

    Klase

    Klasa je osnovna jedinica programiranja na jeziku Java Klase sadre:

    polja (atribute, podatke lanove) metode (operacije, funkcije lanice) mehanizme za stvaranje objekata (konstruktore) inicijalizacione blokove ugneene tipove

    Polja ine strukturu podataka objekta definiu stanje objekta

    Metodi sadre izvrni kod (na njima je fokus obrade) definiu ponaanje objekta

  • 20.02.2013.Klase i objekti3

    Ugovor i implementacija OOP striktno razdvaja pojmove:

    ta se radi kako se radi

    "ta" je opisano ugovorom - skupom: potpisa javnih metoda

    potpis ukljuuje ime metoda, broj i tipove argumenata pridruenom semantikom

    "Kako" je opisano odreenom implementacijom skupom: definicija metoda podataka koji nisu javni

    Javni podaci su i deo implementacije, ali i ugovora to svakako treba izbegavati (osim konstanti)

  • 20.02.2013.Klase i objekti4

    Primer jednostavne klase Klasa NebeskoTelo uva podatke o nebeskim telima:

    class NebeskoTelo {private static long sledeciID = 0;private long id=sledeciID++;private String ime="nepoznato";private NebeskoTelo kruziOko; public long citajId(){return id;}public NebeskoTelo(String ime){this.ime=ime;}public NebeskoTelo(String ime, NebeskoTelo centar){this(ime); kruziOko = centar;

    }}

    Definicija klase uvodi novi naziv tipa (NebeskoTelo)

  • 20.02.2013.Klase i objekti5

    Stvaranje objekata Referenca na objekat klase se definie na sledei nain:

    NebeskoTelo merkur; Gornja definicija reference na objekat ne stvara objekat Primer dela modela solarnog sistema:

    public static void main(String[] args){NebeskoTelo sunce=new NebeskoTelo("Sunce");NebeskoTelo zemlja=new NebeskoTelo("Zemlja", sunce);NebeskoTelo mesec=new NebeskoTelo("Mesec", zemlja);

    } Operator new stvara objekat i vraa referencu na njega Tip objekta i parametri konstruktora treba da budu specificirani Objekat se nalazi u memoriji za dinamiku dodelu (heap) Ako nema dovoljno memorije javlja se izuzetak OutOfMemoryError

  • 20.02.2013.Klase i objekti6

    Metod toString

    Metod toString() slui za konverziju proizvoljnog objekta u String toString() se poziva kada se objekat koristi u konkatenaciji sa nekom niskom I primitivni podaci u konkatenaciji sa niskom se automatski konvertuju u String Primer (u klasi NebeskoTelo) :

    public String toString(){String opis = id + " (" + ime + ")";if (kruziOko != null) opis+= " centar rotacije: " + kruziOko;return opis;

    }// u metodi main:System.out.println("Telo " + sunce);System.out.println("Telo " + zemlja);System.out.println("Telo " + mesec);

    Izlaz:Telo 0 (Sunce)Telo 1 (Zemlja) centar rotacije: 0 (Sunce)Telo 2 (Mesec) centar rotacije: 1 (Zemlja) centar rotacije: 0 (Sunce)

  • 20.02.2013.Klase i objekti7

    Polja Promenljive u klasama se nazivaju poljima (atributima) Primeri: id, ime, kruziOko, sledeciID Polje se moe inicijalizovati u definiciji klase Dve vrste polja:

    nestatika polja: jedno po objektu (id, ime, kruziOko) statika polja: jedno po klasi (sledeciID)

    Svaki objekat ima svoju vlastitu kopiju nestatikog polja Svi objekti dele jednu kopiju statikog polja Statika polja se nazivaju i promenljive klase Statika polja se inicijalizuju im se klasa uita u memoriju Nestatika polja se inicijalizuju kad se stvori objekat

  • 20.02.2013.Klase i objekti8

    Kontrola pristupa

    lanovi su pristupani u celom kodu klase u kojoj se nalaze Prava pristupa lanu iz drugih klasa se odreuju modifikatorom: private

    lan je pristupaan samo u klasi gde je definisan (bez modifikatora pristupa, podrazumevano, paketsko pravo)

    lan je pristupaan samo u kodu datog paketa protected

    lan je pristupaan u izvedenim potklasama i u kodu celog paketa public

    lan je pristupaan sa proizvoljnog mesta odakle se moe pristupiti Svako vie pravo ukljuuje prethodna prava

  • 20.02.2013.Klase i objekti9

    Metodi

    Sadre kod koji manipulie stanjem objekta Pozivaju se preko referenci na objekte koristei operator .

    referenca.metod(parametri) Svaki parametar ima specificiran tip Parametri ne mogu imati podrazumevane vrednosti Promenljiv broj parametara podran od verzije 5.0

    void metod(Object ... arg); podrka za formatirani izlaz sa promenljivim brojem parametara:

    System.out.printf(%s %3d, ime, godine); Povratni tip se deklarie ispred imena metoda

    ako metod ne vraa nikakvu vrednost tip "rezultata" je void Svi parametri metoda se prenose iskljuivo po vrednosti

    vrednosti parametara u telu metode su kopije stvarnih parametara Referenca se prenosi po vrednosti, a objekat po referenci

  • 20.02.2013.Klase i objekti10

    Primer prenosa po vrednosti

    Primer:public static void main(String[] argumenti){

    double jedan = 1.0;System.out.println("pre: jedan="+jedan);prepolovi(jedan);System.out.println("posle: jedan="+jedan);

    }public static void prepolovi(double arg){

    arg /= 2.0; System.out.println("funkcija: pola="+arg);}

    Izlaz:pre: jedan=1funkcija: pola=0.5posle: jedan=1

  • 20.02.2013.Klase i objekti11

    Primer prenosa po referenci

    Primer:public static void main(String[] argumenti){

    NebeskoTelo venera = new NebeskoTelo("Venera", sunce);System.out.println("pre: "+venera);drugoIme(venera); System.out.println("posle: "+venera);

    } public static void drugoIme(NebeskoTelo telo){

    telo.ime = "Zvezda Danica";telo = null; // nema znaaja

    } Izlaz:

    pre: 1 (Venera) centar rotacije: 0 (Sunce)posle: 1 (Zvezda Danica) centar rotacije: 0 (Sunce)

  • 20.02.2013.Klase i objekti12

    Pristupni metodi i preklapanje imena Loa praksa je da polja imaju javni pristup

    spreava promenu implementacije klase Pristupni (accessor) metodi reguliu pristup privatnim podacima Na primer, da bi se osigurao read-only pristup polju id, ono je privatno,

    a odgovarajui metod citajId() ga samo ita nema naina da korisnik klase NebeskoTelo modifikuje polje id

    Preklapanje imena (name overloading): 2 metoda mogu imati isto ime potrebno je da njihovi potpisi sadre razliit broj ili tipove argumenata

    Primer dva pristupna metoda sa preklopljenim imenima:public NebeskoTelo orbitira() {return kruziOko;}public void orbitira(NebeskoTelo centar)

    { kruziOko = centar; }

  • 20.02.2013.Klase i objekti13

    Referenca this

    Specijalna referenca na objekat kojem se upravo pristupa Moe se koristiti unutar nestatikih metoda Nain da se prosledi referenca na tekui objekat kao parametar drugim

    metodima:lista.dodaj(this);

    Implicitan this se dodaje na referencu lana:class Ime { String s;Ime(){ s="bezimeni; } // isto to: this.s="bezimeni"

    } Referenca this se moe koristiti za pristup zaklonjenim lanovima:

    public NebeskoTelo(String ime){this.ime=ime;} Zaklanjanje imena polja imenom argumenta

    dobra praksa samo u konstruktorima i pristupnim metodima

  • 20.02.2013.Klase i objekti14

    Inicijalizacija objekta Inicijalna vrednost polja se moe navesti u definiciji klase

    inicijalizator, izraz koji se izraunava primer:

    public String ime="nepoznato"; Ako se vrednost ne pridrui eksplicitno, bie "nula":

    0, +0.0f, +0.0, \u0000, false ili null Ako je potrebna netrivijalna operacija kreiranja

    poetnog stanja objekta konstruktori Za jednostavnu inicijalizaciju bez argumenata

    inicijalizacioni blokovi

  • 20.02.2013.Klase i objekti15

    Konstruktori

    Konstruktori operacije za inicijalizaciju objekata imaju isto ime kao klasa koju inicijalizuju nula ili vie parametara (kao metodi) nemaju povratnu vrednost (za razliku od metoda)

    Konstruktori se izvravaju nakon to se: poljima pridrue njihove podrazumevane vrednosti izvre eksplicitni inicijalizatori izvre inicijalizacioni blokovi

    Specifini konstruktori Konstruktor bez argumenata (no-arg) za podrazumevanu inicijalizaciju Automatski ugraeni konstruktor bez argumenata i ne radi nita (prazno telo)

    obezbeen samo ako ne postoji drugi konstruktor public ako je klasa javna, odnosno nije javni ako klasa nije javna

    Sa ogranienim pravom pristupa ograniavaju ko moe da kreira objekte privatni, paketski i zatieni

  • 20.02.2013.Klase i objekti16

    Inicijalizacioni blokovi Blok za inicijalizaciju blok naredbi u telu klase Izvravaju se pre konstruktora, po redosledu navoenja

    kao da su sastavni deo na poetku svakog konstruktora Moe da baci izuzetak samo ako su svi konstruktori

    deklarisani da bacaju taj izuzetak Primer (u klasi NebeskoTelo): umesto u inicijalizatoru polja id

    { id = sledeciID++; } Blokovi se koriste za jednostavnu inicijalizaciju:

    kada nisu potrebni argumenti i kada postoji razlog da se izbegne konstruktor bez argumenata

  • 20.02.2013.Klase i objekti17

    Statika polja Statiko polje (promenljiva klase) ima samo jednu pojavu po klasi Statiko polje je tano jedna promenljiva

    bez obzira na broj (ak 0) objekata klase Statiko polje se inicijalizuje pre nego to se:

    bilo koje statiko polje u toj klasi koristi bilo koji metod te klase pone izvravanje

    Primer: class Inicijalizacija{public void init() {y=x;}private static double x = 10.0;private double y;...

    } // x je definisano polje u trenutku korienja

  • 20.02.2013.Klase i objekti18

    Statiki metodi

    Statiki metod moe obavljati opti zadatak za sve objekte klase Statiki metod moe direktno pristupati samo

    statikim poljima statikim metodima klase

    Nestatikim poljima i metodima moe pristupati samo indirektno korienjem reference na neki objekat ijem se polju/metodu pristupa

    Ne postoji this referenca (nema specifinog objekta nad kojim se radi) Izvan klase statikom lanu se pristupa koristei ime klase i operator . U klasi ProstiBrojevi (naredni slajd) su definisani:

    statiki metod: sledeciProstBroj() statiki niz: prviProstiBrojevi korienje izvan klase:

    prostBroj = ProstiBrojevi.sledeciProstBroj();n = ProstiBrojevi.prviProstiBrojevi.length;

  • 20.02.2013.Klase i objekti19

    Statiki inicijalizacioni blokovi Slue za inicijalizaciju statikih polja ili drugih stanja Primer:

    class ProstiBrojevi{ static int[] prviProstiBrojevi=new int[100];static sledeciProstBroj() {...}static {prviProstiBrojevi[0]=2;for (int i=1; i< prviProstiBrojevi.length; i++) prviProstiBrojevi[i]=sledeciProstBroj();

    }// ...

    } Redosled statike inicijalizacije: sleva-udesno i odozgo-nanie U toku izvrenja inicijalizatora statikih polja jo nije pripremljena obrada izuzetaka

    inicijalizatori ne smeju pozivati metode koji deklariu da mogu bacati izuzetke Statiki blok moe zvati metode koji bacaju izuzetke, samo ako moe i da ih hvata

  • 20.02.2013.Klase i objekti20

    Problem cikline statike inicijalizacije Problem:

    ako statiki inicijalizator u klasi A poziva statiki metod u klasi B, a statiki inicijalizator u klasi B poziva statiki metod u klasi A

    ne moe se otkriti u vreme prevoenja B moe jo ne biti napisana kada se A prevodi

    Ponaanje: inicijalizatori A se izvravaju do take poziva metoda klase B pre nego to se izvri metod klase B, inicijalizatori B se izvravaju kada inicijalizator B pozove metod klase A ovaj se izvri

    (iako nije zavrena inicijalizacija klase A) zavravaju se inicijalizatori klase B izvrava se pozvani metod klase B konano, zavravaju se inicijalizatori klase A

  • 20.02.2013.Klase i objekti21

    Primer cikline statike inicijalizacijeclass A{

    static {System.out.println("Izvrenje statikog bloka A poelo"); // (1)B.metod();System.out.println("Izvrenje statikog bloka A zavrava"); // (6)

    }static void metod(){ System.out.println("A.metod"); } // (3)

    }class B{

    static {System.out.println("Izvrenje statikog bloka B poelo"); // (2)A.metod();System.out.println("Izvrenje statikog bloka B zavrava"); // (4)

    }static void metod(){ System.out.println("B.metod"); } // (5)

    }class T{ public static void main(String[] args){ A a = new A(); } }

  • 20.02.2013.Klase i objekti22

    Objekti na koje ne upuuju reference Java eliminie potrebu da se objekti unitavaju eksplicitno Kada ni jedna referenca ne upuuje na objekat,

    prostor koji ovaj zauzima se moe osloboditi Da bi se prostor oslobodio potrebno je

    da nema referenci na objekat: ni u jednom statikom podatku ni u jednoj promenljivoj bilo kog tekue izvravanog metoda ni u jednom polju ili elementu niza do kojeg bi se moglo stii

    poevi od statikih podataka ili promenljivih izvravanih metoda Ako se jedan objekat referie iz objekata koji se vie ne referiu

    moe se i taj izbaciti

  • 20.02.2013.Klase i objekti23

    Sakuplja ubreta Prostor se oslobaa ako je potrebno jo prostora

    sakuplja ubreta eli da izbegne situaciju out of memory ubre se sakuplja bez akcija programera,

    ali sakupljanje ubreta uzima vreme Treba projektovati sisteme koji nisu previe produktivni

    u stvaranju objekata Sakuplja ubreta ne garantuje da e memorija

    uvek biti raspoloiva za sve nove objekte Na ovaj nain Java reava probleme

    viseih referenci i curenja memorije

    Automatsko uklanjanje ubreta otkalnja potrebu za destruktorima destruktori u C++ prvenstveno slue za eksplicitnu razgradnju objekta

  • 20.02.2013.Klase i objekti24

    Metod finalize

    Klasa moe implementirati finalize metod koji se izvrava samo jednom: pre nego to se prostor oslobodi kada se virtuelna maina zaustavlja

    Definisan u klasi Object, potrebno ga je redefinisati:protected void finalize() throws Throwable {super.finalize(); // dobra praksa//...

    } Primer:

    public class ObradaFajla{private Stream fajl;public ObradaFajla(String ime){ fajl=new Stream(ime); } //...public void zatvori(){ if(fajl!=null){fajl.close();fajl=null;} }protected void finalize() throws Throwable { super.finalize(); zatvori(); }

    } Metod zatvori() je napisan korektno i za viestruke pokuaje zatvaranja fajla

  • 20.02.2013.Klase i objekti25

    Izuzeci, izlaz iz aplikacije i finalize Izuzeci i finalize

    telo finalize moe koristiti try/catchda obradi izuzetke metoda koje on pozove

    sve neuhvaeni izuzeci koji su se pojavili za vreme izvrenja finalize se ignoriu

    Izlaz iz aplikacije i finalize kada se izlazi iz aplikacije

    finalize metodi svih postojeih objekata se izvravaju neke greke mogu spreiti da se svi finalize metodi izvre

    na primer: ako se program zavrava zbog nedostatka memorije (out of memory)

  • 20.02.2013.Klase i objekti26

    Oivljavanje objekata Metod finalize moe da reanimira objekat

    postavljajui ponovo referencu na njega na primer, dodajui tu referencu u neku statiku listu

    Nije preporuljivo takvo ponaanje Umesto oivljavanja objekta treba ga klonirati

    klon (novi objekat) preuzima stanje umirueg objekta Metod finalize se pokree tano jednom za svaki objekat Ako je finalize oiveo objekat,

    nee se ponovo izvriti kad se objekat bude stvarno uklanjao To znai da objekat moe samo jednom biti reanimiran

  • 20.02.2013.Klase i objekti27

    Metod main

    main mora biti public, static i void i imati jedan argument tipa String[] Aplikacija moe imati vie main metoda, svaka klasa moe imati jedan main metod Stvarno korieni main je specificiran imenom klase pri pokretanju programa Preporuka: svaka klasa treba da ima main metod za potrebe testiranja Primer (ispisuje parametre main unete preko komandne linije pri pokretanju):

    class Eho {public static void main(String[] argumenti) {for(String a: argumenti) System.out.print(a+" ");System.out.println();

    }}

    Na sistemima sa komandnom linijom Eho se moe pozvati:java Eho se prikazuje

    Rezultat e biti:se prikazuje