OBJEKTNO ORIJENTISANO PROGRAMIRANJEpoincare.matf.bg.ac.rs/~jgraovac/courses/oop/stasa/Cas04.pdf · OSNOVNI POJMOVI. PODSEĆANJE. Objekat – integralna celina podataka i procedura

Embed Size (px)

Citation preview

  • OBJEKTNO ORIJENTISANO

    PROGRAMIRANJE VEBE Staa Vujii Stankovi

  • 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.

    2

  • 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...

    3

  • 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...

    4

  • 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.

    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...

    6

  • 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.

    7

  • KLASE U JAVI

    Definicija klase u sebi sadri:

    atribute ovo su promenljive koje obino razlikuju jedan objekat klase od drugog

    metode one 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.

    8

  • ATRIBUTI U DEFINICIJI KLASE

    Kada kreiramo objekat, on e sadrati sve

    atribute koji se nalaze u definiciji klase.

    Atributi klase mogu da budu primitivnog tipa ili

    mogu da referiu na objekte proizvoljnog klasnog

    tipa, ukljuujui i onaj koji definiemo.

    9

  • 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. 10

  • 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.

    11

  • STATIKI ATRIBUTI

    12

  • 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 da se izvravaju samo u odnosu na objekat.

    13

  • 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.

    14

  • STATIKI METODI MAIN()

    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. 15

  • STATIKI METODI

    Pored main() metoda, verovatno najea

    situacija kada koristimo statike metode je kada

    se klasa koristi kao kontejner za gomilu korisnih

    metoda

    Na primer, 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. 16

  • NESTATIKI METODI

    Napomena!

    Iako se nestatike 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.

    17

  • 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);

    18

  • 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.

    19

  • PRISTUP NESTATIKIM LANOVIMA KLASE

    Instancnim promenljivim i metodima se pristupa

    referenca na objekat.ime lanice:

    Double povrsinaKupe = kupa.povrsina();

    20

  • 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.

    21

  • 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 22

  • 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)!

    23

  • PRENOENJE ARGUMENATA METODAMA

    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.

    24

  • 25

  • PRENOENJE ARGUMENATA METODAMA

    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.

    26

  • 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. 27

  • 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.

    28

  • 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. 29

  • 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.

    30

  • 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.

    31

  • 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. 32

  • PRIMER

    void changeRadius( double radius ){

    this.radius = radius;

    }

    this.radius se odnosi na atribut klase, a

    radius na parametar metoda

    33

  • 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.

    34

  • 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.

    35

  • 36

  • 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.

    37

  • 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.

    38

  • 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

    39

  • KONSTRUKTORI

    Konstruktor moe imati proizvoljan broj

    parametara, ukljuujui i 0 ( bez parametara ).

    Podrazumevani konstruktor nema parametre.

    40

  • 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 . 41

  • 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.

    42

  • 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

    43

  • KLASE U JAVI

    44

  • 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 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.

    45

  • 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.

    46

  • 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.

    47

  • 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.

    48

  • 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.

    49

  • 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.

    50

  • POZIV KONSTRUKTORA IZ DRUGOG

    KONSTRUKTORA

    Jedan konstruktor klase moe da poziva

    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.

    51

  • 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;

    } 52

  • // 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);

    } 53

  • // Metod za ispis imena ucenika

    void stampajIme(){

    System.out.println("Ime ucenika je:

    "+ime);

    }

    }

    54

  • 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); 55

  • /* Ucenik drugi=new Ucenik();

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

    */

    }

    }

    56

  • 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. 57

  • 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.

    58

  • 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.

    59

  • 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 60

  • 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. 61