Vezbe 05 polimorfizam, liste, Vežbe' predlog Računarske mreže
sjenmilan
sjenmilan

Vezbe 05 polimorfizam, liste, Vežbe' predlog Računarske mreže

15 str.
479broj poseta
Opis
java vexbe
20 poeni
poeni preuzimanja potrebni da se preuzme
ovaj dokument
preuzmi dokument
pregled3 str. / 15
ovo je samo pregled
3 prikazano na 15 str.
ovo je samo pregled
3 prikazano na 15 str.
ovo je samo pregled
3 prikazano na 15 str.
ovo je samo pregled
3 prikazano na 15 str.

VEŽBE 05

Polimorfizam

• Metoda koja je implementirana u osnovnoj (baznoj) klasi može da bude implementirana na više različitih načina u različitim izvedenim klasama

• Različiti objekti mogu različito reagovati na istu poruku

• Osnovne klase definišu i implementiraju virtuelne metode, a izvedene klase reimplementiraju te metode po potrebi

• U Javi su sve metode podrazumevano virtual

Reimplementiranje (redefinisanje) – proces implementacije virtuelnih metoda u izvedenim klasama. Kod reimplementirane metode se koristi isti potpis kao I u osnovnoj klasi.

public class Osnovna {

public void PromeniKorisnickoIme(){. . .} } public class Izvedena extends Osnovna {

@Override public void PromeniKorisnickoIme(){. . .}

}

1

Pravila

• Dva metoda moraju biti identična ( isto: ime, tipovi parametara i tip povratne vrednosti )

• Isti pristup (oba javna,..)

2

ZADATAK 1: Za prikazani dijagram klasa uraditi sledeće:

Definisati klasu Račun sa: • Protected poljem stanje : double • Public metodom uplata (double) : void, klasična uplata bez provizije • Public metodom isplata (double) : void, klasična isplata bez provizije • Public getStanje() : double override ugrađenemetode ToString

Definisati klasu Dinarski izvedenu iz klase Racun sa: • metodom isplata (double) : void, provizija pri isplati 5% • override ugrađenemetode ToString

Definisati klasu Devizni izvedenu iz klase Racun sa: • metodom isplata (double) : void, provizija pri isplati 6% • override ugrađenemetode ToString

U glavnom delu programa uraditi: • Kreirati objekta klase Dinarski • Uplatiti 50000 din na račun • Probati uplatu preko polja Stanje • Ispisati stanje na računu toString metodom

• Kreiranje objekta klase Devizni • Uplatiti 1000 eura na račun metodom uplata • Probati uplatu preko polja Stanje • Ispisati stanje na računu toString metodom

• Isplatiti sa dinarskog računa 10000 din • Ispisati stanje na računu toString metodom

• Isplatiti sa deviznog računa 200 eura metodom uplata • Ispisati stanje na računu toString metodom

3

REŠENJE: KOD

publicclass Racun { protecteddouble stanje;

publicdouble getStanje(){ return stanje;

}

// klasicna uplata bez provizije publicvoiduplata(double u) { stanje += u; }

// klasicna isplata bez provizije publicvoidisplata(double i) { stanje -= i; }

// overide ugradjene metode ToString() @Override public String toString() { return ("RACUN = " + stanje); } }

publicclass Dinarski extends Racun {

// isplata sa provizijom od 5 %, override osnovne metode @Override publicvoidisplata(double i) { double provizija = 0.05;

// poziv metode isplata osnovne klase super.isplata(i);

stanje -= i * provizija; }

// overide ugradjene metode ToString() @Override public String toString() { return ("DINARSKI = " + stanje+ " dinara"); }

}

4

5

publicclass Devizni extends Racun{ // isplata sa provizijom od 6 %, override osnovne metode

@Override publicvoidisplata(double i) { double provizija = 0.06;

// poziv metode isplata osnovne klase super.isplata(i);

stanje -= i * provizija; }

// overide ugradjene metode ToString() @Override public String toString() { return ("DEVIZNI = " + stanje + " eura"); } } publicclass Glavna {

publicstaticvoid main(String[] args) {

Dinarski din = new Dinarski(); System.out.println(din); // DINARSKI = 0 dinara System.out.println(din.getStanje()); // 0 // OK, public get

Devizni dev = new Devizni(); System.out.println(dev); // DEVIZNI = 0 eura System.out.println(din.getStanje()); // 0 // OK, public get

din.uplata(50000); din.stanje += 50000; // OK preko izvedene instance, protected System.out.println(din); // DINARSKI = 50 000 dinara System.out.println(din.getStanje()); // 50 000 // OK, public get

dev.uplata(1000); dev.stanje += 1000; // OK preko izvedene instance, protected System.out.println(dev); // DEVIZNI = 1 000 eura System.out.println(dev.getStanje()); // 1 000 // OK, public get

din.isplata(10000); System.out.println(din); // DINARSKI = 39 500 dinara System.out.println(din.getStanje()); // 39 500 // OK, public get

dev.isplata(200); System.out.println(dev); // DEVIZNI = 788 eura System.out.println(dev.getStanje()); // 788 // OK, public get

} }

NAPOMENA:@override se ne mora postavljati kod redefinisanih metoda ali ukoliko komplajler ne nađe željenu metodu javiće grešku, bez @override neće prijaviti ništa

6

VEŽBA: Modifikovati zadataka da se deklariše objekat Racun i u zavisnosti od želje korisnika kreira Dinarski ili Devizni račun i nakon toga uradi uplata i isplata primenom polimorfnih metoda. ZADATAK 2: Za zadatak 1 povećati sigurnost na sledeći način:

U klasi Racun: • polje stanje postaviti na private • Kreirati protected get i set metode • Unutar metode setStanje(double) tražiti od korisnika da unese šifru i ako je uneta šifra

„1111“ dozvoliti promenu stanja, u suprotnom ispisati poruku „Pogrešna šifra !!!“ • Metodu uplata (double) realizovati preko setStanje metode

U klasi Dinarski: • Metodu isplata (double) realizovati preko setStanje metode

U klasi Devizni: • Metodu isplata (double) realizovati preko setStanje metode

U glavnom delu programa uraditi: • Kreirati objekta klase Dinarski • Uplatiti 50000 din na račun metodom uplata (uneti sifru “1111”) • Probati uplatu preko polja Stanje • Ispisati stanje na računu toString metodom

• Kreiranje objekta klase Devizni • Uplatiti 1000 eura na račun metodom uplata (uneti sifru “1234”) • Probati uplatu preko polja Stanje • Ispisati stanje na računu toString metodom

• Isplatiti sa dinarskog računa 10000 din (uneti sifru “1111”) • Ispisati stanje na računu toString metodom

• Isplatiti sa deviznog računa 200 eura (uneti sifru “1234”) • Ispisati stanje na računu toString metodom

7

REŠENJE: KOD import java.util.Scanner;

publicclass Racun { privatedouble stanje;

protecteddouble getStanje(){ return stanje;

}

// setovanje sa autentifikacijom protectedvoid setStanje(double stanje) {

Scanner scanf = new Scanner(System.in);

System.out.println("Unesite sifru"); String pass = scanf.next();

if (pass.equals("1111")) this.stanje = stanje;

else System.out.println("Pogresna sifra!!!");

}

// autorizovana uplata bez provizije publicvoid uplata(double u) {

setStanje(stanje + u); }

// autorizovana isplata bez provizije publicvoid isplata(double i) {

setStanje(stanje - i); }

// overide ugradjene metode ToString() @Override public String toString() {

return ("RACUN = " + stanje); }

} publicclass Dinarski extends Racun {

// isplata sa provizijom od 5 %, override osnovne metode @Override publicvoid isplata(double i) {

setStanje(getStanje() - 1.05 * i); } // overide ugradjene metode ToString() @Override public String toString() {

return ("DINARSKI = " + getStanje()+ " dinara");

8

} } publicclass Devizni extends Racun{

// isplata sa provizijom od 6 %, override osnovne metode @Override publicvoid isplata(double i) {

setStanje(getStanje() - 1.06 * i); }

// overide ugradjene metode ToString() @Override public String toString() { return ("DEVIZNI = " + getStanje() + " eura"); } } publicclass Glavna {

publicstaticvoid main(String[] args) {

Dinarski din = new Dinarski(); System.out.println(din); // DINARSKI = 0 dinara System.out.println(din.getStanje()); // 0 // OK, protected

Devizni dev = new Devizni(); System.out.println(dev); // DEVIZNI = 0 eura System.out.println(din.getStanje()); // 0 // OK, protected get

din.uplata(50000); // uneti "1111" // din.stanje += 50000; // GRESKA, private

System.out.println(din); // DINARSKI = 50 000 dinara System.out.println(din.getStanje()); // 50 000 // OK, protected

dev.uplata(1000); // uneti "1234" // dev.stanje += 1000; // GRESKA, private

System.out.println(dev); // DEVIZNI = 0 eura, System.out.println(dev.getStanje()); // 0 // OK, protected

din.isplata(10000); // uneti "1111" System.out.println(din); // DINARSKI = 39 500 dinara System.out.println(din.getStanje()); // 39 500 // OK, protected

dev.isplata(200); // uneti "1234" System.out.println(dev); // DEVIZNI = 0 eura,

System.out.println(dev.getStanje()); // 0 // OK, protected }

}

ZAKLJUČAK: Sigurnost koda se dosta povećala jer se ne dozvoljava pristup polju direktno a preko dostupne metode setStanje ( ) vrši se provera osobe koji želi da promeni stanje na računu.

9

Overide i hide metoda

• Metode instance izvedene klase redefinišu metodu osnovne klase istog potpisa.

• Metode klase (static) izvedene klase sakrivaju metodu osnovne klase istog potpisa.

• Sakrivanje ima uticaja u zavisnosti da li se metoda poziva preko osnovne ili izvedene klase

PRIMER:

publicclass Osnovna { publicvoid metodaInstance(){

System.out.println("OSNOVNA INSTANCA"); }

publicstaticvoid metodaKlase(){ System.out.println("OSNOVNA KLASA");

} }

publicclass Izvedena extends Osnovna{ publicvoid metodaInstance(){

System.out.println("IZVEDENA INSTANCA"); }

publicstaticvoid metodaKlase(){ System.out.println("IZVEDENA KLASA");

} }

publicclass Glavna { publicstaticvoid main(String[] args) {

Osnovna o = new Osnovna(); o.metodaInstance(); //OSNOVNA INSTANCA o.metodaKlase(); //OSNOVNA KLASA

Izvedena iz = new Izvedena(); iz.metodaInstance(); //IZVEDENA INSTANCA iz.metodaKlase(); //IZVEDENA KLASA

Osnovna os = new Izvedena(); os.metodaInstance(); //IZVEDENA INSTANCA os.metodaKlase(); //OSNOVNA KLASA

} }

NAPOMENA: @override ispred static metode izvedene klase javlja grešku

10

11

LISTE

• Liste su posebni tipovi kolekcija definisani unutar java.util biblioteke

• Omogućavaju lakši rad sa grupama podataka od nizova

• Kroz liste se može kretati kao i kroz nizove ali i pomoću Iteratora

class Glavna {

publicstaticvoid main(String args[]) {

ArrayList<Object> arl = new ArrayList<Object>();

Integer i1 = new Integer(10); Integer i2 = new Integer(20); Integer i3 = new Integer(30); Integer i4 = new Integer(40); String s1 = "test";

System.out.println("1 Sadrzaj liste: " + arl); System.out.println("2 Velicina liste: " + arl.size());

arl.add(i1); arl.add(i2); arl.add(s1);

System.out.println("3 Sadrzaj liste: " + arl); System.out.println("4 Velicina liste: " + arl.size());

arl.add(i1); arl.add(i2); arl.add(i3); arl.add(i4);

System.out.println("5 Sadrzaj liste: " + arl); System.out.println("6 Velicina liste: " + arl.size());

arl.remove(3); // uklanja objekat sa pozicije 3

Object a = arl.clone(); // klonirana lista

System.out.println("7 Sadrzaj klona: " + a); System.out.println("8 Sadrzaj liste: " + arl); System.out.println("9 Velicina liste: " + arl.size());

arl.clear(); // prazni se lista

System.out.println("10 Sadrzaj liste: " + arl); System.out.println("11 Velicina liste: " + arl.size());

} }

12

ISPIS U KONOZOLI 1 Sadrzaj liste: [] 2 Velicina liste: 0

3 Sadrzaj liste: [10, 20, test] 4 Velicina liste: 3

5 Sadrzaj liste: [10, 20, test, 10, 20, 30, 40] 6 Velicina liste: 7

7 Sadrzaj klona: [10, 20, test, 20, 30, 40] 8 Sadrzaj liste: [10, 20, test, 20, 30, 40] 9 Velicina liste: 6

10 Sadrzaj liste: [] 11 Velicina liste: 0

ZADATAK 1: Definisati klasu Osoba sa:

• Private poljima ime, prezime : String • Private poljima godiste : int • Public parametarizovanim konstruktor • Override metode toString

U glavnom delu programa uraditi: • Definisati ArrayList ls za klasu Osoba • Kreirati nekoliko instance klase Osoba • Dodati ih u listu • For petljom iteritati kroz listu • Foreach petljom iteritati kroz listu • Iteratorom iterirati kroz listu • Zameniti objekat liste na 0. Poziciji • Ispisati poziciju nekog objekta u listi

REŠENJE: KOD publicclass Osoba {

private String ime, prezime; privateint godiste;

public Osoba(String ime, String prezime, int godiste) { this.ime = ime; this.prezime = prezime; this.godiste = godiste;

} @Override public String toString() {

return (ime+" "+prezime+": "+godiste+". godiste"); }

}

13

publicclass Glavna {

publicstaticvoid main(String[] args) {

ArrayList<Osoba> ls = new ArrayList<Osoba>();

Osoba o1 = new Osoba("Milan", "Milanovic", 1990); Osoba o2 = new Osoba("Ivan", "Ivanovic", 1995); Osoba o3 = new Osoba("Jovan", "Jovanovic", 1985);

ls.add(o1); ls.add(o2); ls.add(o3);

// klasicna for petlja for (int i=0; i<ls.size(); i++)

System.out.println(ls.get(i));

// foreach petlja for (Osoba pom : ls)

System.out.println(pom);

// list iterator Iterator<Osoba> it = ls.iterator();

while (it.hasNext()){ Osoba pom = it.next();

System.out.println(pom); }

ls.set(0, o3); // menja objekat na poziciji 0 System.out.println(ls); // ispisuje celu listu kao toString

System.out.println("Pozicija osobe o2:" + ls.indexOf(o2)); }

} ISPIS U KONZOLI Milan Milanovic: 1990. godiste Ivan Ivanovic: 1995. godiste Jovan Jovanovic: 1985. Godiste

Milan Milanovic: 1990. godiste Ivan Ivanovic: 1995. godiste Jovan Jovanovic: 1985. Godiste

Milan Milanovic: 1990. godiste Ivan Ivanovic: 1995. godiste Jovan Jovanovic: 1985. Godiste

[Jovan Jovanovic: 1985. godiste, Ivan Ivanovic: 1995. godiste, Jovan Jovanovic: 1985. godiste]

14

Pozicija osobe o2:1

15

nema postavljenih komentara
ovo je samo pregled
3 prikazano na 15 str.