JAVA PROGRAMIRANJE-NASLEĐIVANJE (HIJERARHIJA KLASA)
Nasleđivanje klasa je postupak izgradnje novih klasa na nekim postojećim. Skup nekih osobina i ponašanja objekta koje se mogu naći u postojećim klasama mogu se preneti na nove postupkom nasleđivanja. Za to se koristi službena reč Java jezika "extends".
Sintaksa je:
Sintaksa je:
public class Subklasa_ime extends Superklasa_ime
{
//Atributi
//Metode
}//Metode
Svrha pravljenja podklase (subklase) je proširiti postojeće stanje i ponašanje nadređene klase(superklase). Nadređena klasa se još zove "roditelj" klasa, a podređena klasa "dete" klasa.
Više klasa može biti u hijerarhiji. Ako jedna klasa, npr Klasa_3, nasledi drugu(Klasa_2), a ova, opet neku prethodnu npr. klasu "Klasa_1", onda klasa 3 nasleđuje sve prethodne osobine i metode u hijerarhiji.
Ako bi napravili hijerarhiju klasa koje predstavljaju automobile to bi izgledalo:
VIDEO LEKCIJE
VIDEO 1: Nasleđivanje klasa u JAVI
Posmatrajmo npr. klasu koja opisuje neku osobu. Ona bi trebala da ima sledeće atribute: ime, prezime, pol, jmbg, kao i metodu toString koja vraca sve podatke kao jedan String.
Ako bi sada želeli da pravimo klasu koja opisuje nekog učenika(Ucenik), treba da uočimo da će ona imati sve atribute koje su već navedene u klasi Osoba , jer učenik zapravo i jeste neka osoba i još neke atribute pored toga, npr. razred , uspeh itd.
Pošto Java podržava nasleđivanje klasa, mi onda možemo napraviti klasu Ucenik tako da proširuje klasu Osoba, tj. nasleđuje njene osobine i metode. Umesto toga, mogli bismo i pisati klasu Ucenik ispočetka pa osobine i metode iz Osoba ponovo pisati, ali to je lošiji put.
Evo kako bi izgledala klasa Ucenik koja nasleđuje klasu Osoba:
Pošto Java podržava nasleđivanje klasa, mi onda možemo napraviti klasu Ucenik tako da proširuje klasu Osoba, tj. nasleđuje njene osobine i metode. Umesto toga, mogli bismo i pisati klasu Ucenik ispočetka pa osobine i metode iz Osoba ponovo pisati, ali to je lošiji put.
Evo kako bi izgledala klasa Ucenik koja nasleđuje klasu Osoba:
Zapazite da nisu navedeni atributi koji se nalaze u klasi Osoba: ime,prezime,…Međutim, kada se bude napravio objekat klase Ucenik on će imati u sebi i ove atribute jer su nasleđeni iz klase Osoba. To možemo proveriti tako što napravimo objekat ucenika i kada posle objekta stavimo operator “.” videćemo sve atribute objekta ucenik:
Razred,skola i uspeh su istaknuti jer su specificni samo za klasu Ucenik. Ime, prezime, jmbg, pol i metoda toString() su nasleđene iz klase Osoba.
Svaka klasa bez obzira što eksplicito ne piše, nasleđuje i klasu Object, koja u sebi ima metode: equals(),hashCode(),notify() itd, tj. sve ostale metode koje se vide na slici iznad.
Svaka klasa bez obzira što eksplicito ne piše, nasleđuje i klasu Object, koja u sebi ima metode: equals(),hashCode(),notify() itd, tj. sve ostale metode koje se vide na slici iznad.
Prepravljanje metoda u JAVI
Ako pozovemo metodu toString() za objekat ucenik, biće pozvana metoda toString() definisana u klasi Roditelja tj. klasi Osoba, što je logično, jer je ona nasleđena. Ona će vratiti podatke osobe: ime,prezime itd. ali ne i razred, uspeh. U nasleđivanju klasa postoji mogućnost da se ta ista metoda prepravi(override) u klasi Ucenik tako da vraća i podatke o razredu, uspehu. Tada ucenik.toString() poziv metode predstavlja poziv prepravljene metode, a ne nasleđene toString() metode iz klase Osoba. Evo primera upotrebe te metode:
Definisanje metode toString():
i upotreba
Pristup atributima i metodama nadređene klase
Ako iz neke klase u datom primeru npr. klase Ucenik želimo da pristupimo atributu ili metodi koja se nalazi u roditelj klasi to možemo uraditi korišćenjem službene reči super.
Upotrebu ove reči vidimo kod konstruktora sa parametrima klase Ucenik
Upotrebu ove reči vidimo kod konstruktora sa parametrima klase Ucenik
Unutar konstruktora Ucenik se poziva konstruktor Osoba korišćenjem reči super i njemu se prosleđuju parametri za klasu Osoba, a to su ime,prezime...
Drugi primer je prepravljena metoda toString():
Drugi primer je prepravljena metoda toString():
Treba uočiti da će se podaci o osobi dobiti pozivanjem metode toString() klase osoba. Objekat koji ovde predstavlja osobu je zapravo službena reč „super“.
Poznate hijerarhije klasa
Primer hijerarhije klasa iz API-ja imamo u SWING paketu, a to su klase JButton, JLabel, JTextField.. tj. one klase koje predstavljaju komponente na formi. Evo primera takve hijerarhije:
Swing komponente nasleđuju klasu JComponent, i jedan takav primer videćemo na sledećoj slici:
Java i fizika
Posmatrajmo sledeći problem:
Želimo da simuliramo promenu položaja x pri dejstvu sile na telo koje stoji na horizontalnoj podlozi. Posmatraćemo promene položaja za svaki mali porast vremena od dt[s]. Uzmimo da je ta promena za dt=0.05s.
Telo mase m će iz stanja mirovanja dobiti ubrzanje u x pravcu ax ako je F>Ftr.
Telo mase m se neće kretati u y pravcu (ay=0) jer je N=Fg
gde je:
Fg - Težina tela
N-reakcija podloge
Da bi kretanje simulirali potrebne su nam sile koje deluju na telo.
Kreiraćemo po jedan objekat za svaku silu koja deluje na telo:
F, Ftr,N i Fg
Želimo da simuliramo promenu položaja x pri dejstvu sile na telo koje stoji na horizontalnoj podlozi. Posmatraćemo promene položaja za svaki mali porast vremena od dt[s]. Uzmimo da je ta promena za dt=0.05s.
Telo mase m će iz stanja mirovanja dobiti ubrzanje u x pravcu ax ako je F>Ftr.
Telo mase m se neće kretati u y pravcu (ay=0) jer je N=Fg
gde je:
Fg - Težina tela
N-reakcija podloge
Da bi kretanje simulirali potrebne su nam sile koje deluju na telo.
Kreiraćemo po jedan objekat za svaku silu koja deluje na telo:
F, Ftr,N i Fg
Kreiraćemo po jedan objekat za svaku silu koja deluje na telo:
F, Ftr,N i Fg
Da bi kreirali objekte potrebne su nam klase koje će da ih opišu:
Napravimo prvo klase za silu teže G i silu trenja Ftr.
F, Ftr,N i Fg
Da bi kreirali objekte potrebne su nam klase koje će da ih opišu:
Napravimo prvo klase za silu teže G i silu trenja Ftr.
public class SilaTeze
{
double intenzitet, smer, m;
String naziv;
final double G=9.81;
public SilaTeze(double smer, double m)
{
this.smer = smer;
this.m = m;
}
public void intenzitet()
{
intenzitet=m*G;
}
public void setNaziv(String naziv)
{
this.naziv=naziv;
}
}
{
double intenzitet, smer, m;
String naziv;
final double G=9.81;
public SilaTeze(double smer, double m)
{
this.smer = smer;
this.m = m;
}
public void intenzitet()
{
intenzitet=m*G;
}
public void setNaziv(String naziv)
{
this.naziv=naziv;
}
}
public class SilaTrenja
{
double intenzitet, koefTrenja, N;
int smer;
String naziv;
public SilaTrenja(double koefTrenja, double N)
{
this.koefTrenja = koefTrenja ;
N = n;
}
public void intenzitet()
{
intenzitet=koefTrenja*N;
}
public void setNaziv(String naziv)
{
this.naziv=naziv;
}
}
{
double intenzitet, koefTrenja, N;
int smer;
String naziv;
public SilaTrenja(double koefTrenja, double N)
{
this.koefTrenja = koefTrenja ;
N = n;
}
public void intenzitet()
{
intenzitet=koefTrenja*N;
}
public void setNaziv(String naziv)
{
this.naziv=naziv;
}
}
Uočimo sledeće:
- Obe klase imaju zajedničke osobine naziv,intenzitet i koefPravca kao i metodu setNaziv();
- Kod obe klase postoji metoda intenzitet(), ali se razlikuju naredbe unutra.
- Ostale osobine i metode su specifične samo za silu teže a neke samo za silu trenja.
Ako bi te zajedničke osobine izdvojili u posebnu klasu
public class Sila
{
double intenzitet;
int smer;
String naziv;
public Sila(int smer)
{
this.smer = smer;
}
public void setNaziv(String naziv)
{
this.naziv=naziv;
}
}
{
double intenzitet;
int smer;
String naziv;
public Sila(int smer)
{
this.smer = smer;
}
public void setNaziv(String naziv)
{
this.naziv=naziv;
}
}
Tada, klasa SilaTeze, kao i SilaTrenja nasleđuju klasu sila. Posle naziva klase treba dodati
extends Sila
extends Sila
public class SilaTeze extends Sila
{
double m;
final doubleG=9.81;
public SilaTeze(int smer, double m)
{
super(smer);
this.smer = smer;
}
public void intenzitet()
{
intenzitet=m*G;
}
}
{
double m;
final doubleG=9.81;
public SilaTeze(int smer, double m)
{
super(smer);
this.smer = smer;
}
public void intenzitet()
{
intenzitet=m*G;
}
}
Podaci naziv i intenzitet
kao i metoda setNaziv()
koji su prebačeni u klasu Sila su sada nasleđeni i biće dodeljeni objektima klase SilaTeze
kao i metoda setNaziv()
koji su prebačeni u klasu Sila su sada nasleđeni i biće dodeljeni objektima klase SilaTeze
Da bi sada, testirali ove klase, moramo u test klasi kreirati objekat koji predstavlja silu teže. Objekat će imati sve atribute i metode koje su opisani u klasi, kojoj pomenuti objekat pripada. Da bi smo odabrali neku od osobina ili metoda kreiranog objekta, koristimo operator "." kao na slici ispod.
U prozoru koji se otvorio, kada smo posle reference objekta stavili tačku, vidimo osbine i metode, kako one što su direktno pisane u klasi SilaTeže, tako i sve one nasleđene iz prethodnih klasa u hijerarhiji. Tako npr. intenzitet je nasleđena osobina iz klase Sila, dok je toString() nasleđena metoda iz klase Object.
Primer:Za masu tela m=3kg kreirati objekat sile teže, dati mu naziv, izračunati intenzitet sile i prikazati na ekranu.
public class AnalizaSilaTest
{
public static void mainString [](args )
{
SilaTeze teza = new SilaTeze(1,3);
teza.setNaziv("Sila teze");
teza.intenzitet();
System.out.println( teza.naziv+" iznosi "+teza.intenzitet()+" N");
}
}
{
public static void mainString [](args )
{
SilaTeze teza = new SilaTeze(1,3);
teza.setNaziv("Sila teze");
teza.intenzitet();
System.out.println( teza.naziv+" iznosi "+teza.intenzitet()+" N");
}
}
Prvo je kreiran objekat teza koji pripada klasi SilaTeze, gde je upotrebljen konstruktor sa parametrima, gde se kao parametri šalju smer vektora i masa tela. Zatim se preko reference objekta pozivaju metode setNaziv() i intenzitet(). Metoda intenzitet je metoda koja izračunava intenzitet, ali nema nikakvu povratnu vrednost(void). U poslednjem koraku se prikazuju izračunate vrednosti na standardni izlaz.
Prepravljanje metoda(engl. overriding)
Sve klase nasleđuju klasu Object, tako da su nasledile sve njene metode.
Metoda toString() je jedna od nasleđenih metoda iz Object klase, i predviđena je da formira tekst za prikaz podataka iz objekta kome pripada.
Međutim, u telu te metode koja je napisana u klasi Object nema ništa jer u toj klasi nema podataka, zato se metoda toString() prepravlja u klasi koja je nasledi, u našem slučaju to su Sila i kasnije SilaTeže.
Metoda toString() je jedna od nasleđenih metoda iz Object klase, i predviđena je da formira tekst za prikaz podataka iz objekta kome pripada.
Međutim, u telu te metode koja je napisana u klasi Object nema ništa jer u toj klasi nema podataka, zato se metoda toString() prepravlja u klasi koja je nasledi, u našem slučaju to su Sila i kasnije SilaTeže.
Ovde nam je ponuđena klasa Object jer smo nju nasledili. Štikliramo toString() od ponuđenih metoda i kliknemo na OK dugme
Primer 2: Telo mase m miruje na horizontalnoj podlozi i na njega u jednom trenutku počne da deluje konstantna sila F u pravcu x ose; Odrediti na kom položaju u odnosu na početni će se naći centar mase tela posle vremena t. Koeficijent trenja je 0,05.
Kreirati objekte koji predstavljaju redom sve sile na telo koristeći nasleđivanje klasa. Ispisati intenzitete svih sila. Uzeti za pozitivne vrednosti intenzitete ako deluju u pravcu koo osa.
Sledeće
Apstrakne klase i interfejsi>| |