Apstrakcija (Abstraction) u Javi
Apstrakcija (eng. Abstraction) jedan je od koncepata objektno-orijentiranog programiranja. Apstrakcijom se skrivaju kompleksni detalji softvera od korisnika, a prikazuje se samo najbitnija funkcionalnost.
Primjer apstrakcije može biti ovaj tutorijal: vi ga sad čitate u svom pregledniku, ali sve što je potrebno da se on prikaže unutar preglednika vama ostaje skriveno, apstraktno. Kao korisnik dobili ste funkcionalnost, ali nemate pristup detaljima.
Još jedan primjer apstrakcije je vožnja automobila. Kad pokrenete automobil i vozite se njime, rad motora je za vas apstraktan i uopće ne znate koji se procesi odvijaju unutar njega. Kao vozač dobili ste samo funkcionalnost automobila, ali ne i njegove kompleksne detalje.
Apstrakcija u programiranju postiže se na dva načina: pomoću apstraktne klase i pomoću Interfacea. U ovom tutorijalu fokus je na apstrakciji pomoću apstraktne klase. Interface ćemo raditi u posebnom tutorijalu.
Apstrakcija pomoću apstraktne klase
Kreirat ćemo novu klasu Vehicle
i deklarirati ju kao apstraktnu. Ujedno ćemo dodati dvije metode radi boljeg razumijevanja. Važno je zapamtiti kako nije dopušteno raditi instancu apstraktne klase, nego to radimo na drugi način, što ćemo pokazati kasnije u primjeru.
abstract class Vehicle {
abstract void engineRuns();
public void moving(int speed) {
System.out.println("This vehicle is moving at " + speed + " km/h.");
}
}
U primjeru smo unutar klase Vehicle
definirali apstraktnu metodu engineRuns()
. Apstraktne metode mogu se definirati isključivo unutar apstraktne klase i nigdje drugdje. Isto tako, apstraktna metoda nema tijelo, nego se tijelo metode definira u podklasi pomoću nasljeđivanja. Drugim riječima, takva se metoda deklarira bez implementacije.
Apstraktna klasa ne mora sadržavati samo apstraktne nego i sve uobičajene (‘concrete’ ili konkretne) metode. Kao što vidite, dodali smo javnu metodu moving(int speed)
, u kojoj smo definirali brzinu vozila. Sada ćemo kreirati dvije dodatne klase (podklase), koje će naslijediti svojstva apstraktne klase Vehicle
.
public class Car extends Vehicle {
@Override
void engineRuns() {
System.out.println("Driving to work.");
}
}
Klasa Car
je pomoću ključne riječi extends naslijedila svojstva klase Vehicle
. To znači da je naslijedila metodu engineRuns()
, iznad koje smo dodali anotaciju @Override
. Tom anotacijom nadjačavamo (‘overrideamo’) metodu engineRuns()
iz nadklase i mijenjamo ju metodom engineRuns()
iz podklase. Također je naslijedila metodu moving(int speed)
i njena svojstva.
Nauči programirati: OG-CS YouTube tutorijali
Druga klasa koju ćemo dodati je SchoolBus
. Ona će također naslijediti sva svojstva klase Vehicle
, ali će se razlikovati tijelo metode engineRuns()
. Ako vas zbunjuje nadjačavanje (‘overrideanje’) metoda u podklasama pogledajte naš tutorijal o polimorfizmu, gdje smo to detaljno objasnili.
public class SchoolBus extends Vehicle {
@Override
void engineRuns() {
System.out.println("Driving children to school.");
}
}
Kao što vidite, apstraktnom klasom Vehicle sakrili smo detalje od korisnika, koji je dobio samo funkcionalnost. U automobilu radi njegov motor dok putujete na posao, ali vi ne znate što se zapravo odvija ispod njegovog poklopca. Isto vrijedi i za autobus: prevest će učenike do škole koji su tako dobili funkcionalnost vožnje, ali ništa ne znaju što je zapravo potrebno za njihovo putovanje.
Sada ćemo provjeriti funkcionalnost našeg koda. Sjetimo se, u uvodu smo rekli kako ne možemo raditi instancu apstraktne klase, ali zato možemo kreirati instancu njene podklase.
public class Main {
public static void main(String[] args) {
Vehicle car = new Car();
Vehicle schoolBus = new SchoolBus();
car.engineRuns();
car.moving(70);
schoolBus.engineRuns();
schoolBus.moving(45);
}
}
Kreirali smo instance obje podklase koje su naslijedile sva svojstva apstraktne klase Vehicle
. U klasi Vehicle
se nalaze apstraktna metoda engineRuns()
i javna metoda moving(int speed)
, što znači da se te dvije metode nalaze i unutar klasa Car
i SchoolBus
. Ako pozovemo main metodu, rezultat ispisa bit će sljedeći:
// rezultat ispisa za klasu Car
Driving to work.
This vehicle is moving at 70 km/h.
// rezultat ispisa za klasu SchoolBus
Driving children to school.
This vehicle is moving at 45 km/h.
Ovim jednostavnim primjerom smo pokazali kako funkcionira apstrakcija u Javi. Kreirali smo apstraktnu klasu Vehicle
, u kojoj smo sakrili kompleksne detalje rada vozila od vozača i prepustili mu samo osnovnu funkcionalnost.