18. Apstraktna klasa u Javi

Klasa koja je deklarisana sa ključnom riječi abstract, je poznata kao apstraktna klasa u javi. Ona može imati apstraktne i ne-apstraktne metode (metode sa tijelom).
Prije upoznavanja sa java apstraktnom klasom, prvo treba shvatiti pojam apstrakcije u javi.

 

Apstrakcija u javi

Apstrakcija je proces skrivanja detalja implementacije i pokazivanja korisniku samo funkcionalnosti.
Drugim riječima, korisniku se pokazuju samo važne stvari, a unutrašnji detalji ostaju skriveni. Napr. pri slanju sms-a, mi samo kucamo tekst i šaljemo poruku. Nije nam poznato interno procesiranje vezano za slanje poruke.
Apstrakcija nam dopušta da se fokusiramo na to što objekt radi umjesto na kako to radi.

 

Načini za postizanje apstrakcije
Postoje dva načina za postizanje apstrakcije u javi

  1. Apstraktna klasa (0 do 100%)
  2. Interfejs (100%)

Apstraktna klasa u javi

Klasa koja je deklarisana kao apstraktna naziva se apstraktna klasa. Ona mora biti naslijeđena i njen metod implementiran. Ona ne može biti instancirana.
Apstraktna klasa je neka vrsta fantomske klase. Ona može prosljeđivati metode i varijable, ali sama nikada ne može biti instancirana, tj. nije moguće kreirati objekt apstraktne klase. U tom smislu, apstraktna klasa je poput interfejsa, ali za razliku od njega ona može sadržavati metode koji nisu apstraktni. Takođe može sadržavati deklaracije podataka koji nisu konstante.
Svaka klasa koja sadrži jedan ili više apstraktnih metoda mora biti deklarisana kao apstraktna. U apstraktnim klasama (za razliku od interfejsa) modifikator abstract mora biti primijenjen na svaki apstraktni metod.
Apstraktne klase se ponašaju kao „držači mjesta“ (placeholderi) u hijerarhiji klasa. Na primjer, apstraktna klasa može sadržavati djelimičnu deskripciju koju nasljeđuju svi njeni potomci u hijerarhiji klasa. Njena djeca, koja su mnogo određenija, popunjavaju praznine.
Apstraktni metod nikada ne može biti static.

 

Primjer apstraktne klase

  abstract class A{}
Apstraktni metod
Metod koji je deklarisan kao apstraktan i koji nema implementaciju se naziva apstraktni metod.

Primjer apstraktnog metoda

abstract void printStatus();  //nema tijela i ima abstract

Primjer apstraktne klase koja ima apstraktni metod
U ovom primjeru, apstraktna klasa Bike sadrži samo jedan apstraktni metod run. Njegovu implementaciju obezbjeđuje klasa Honda.

abstract class Bike{  
  abstract void run();  
}  
  
class Honda4 extends Bike{  
void run(){System.out.println("running safely..");}  
  
public static void main(String args[]){  
 Bike obj = new Honda4();  
 obj.run();  
}  
}
Ispis na ekranu:
running safely..

Razumijevanje stvarnog scenarija apstraktne klase
U ovom primjeru, Shape je apstraktna klasa, a njenu implementaciju obezbjeđuju klase Rectangle i Circle. Najčešće, mi ne znamo ništa o implementaciji klase (tj. ona je skrivena za krajnjeg korisnika) a  objekt implementacione klase obezbjeđuje factory metod.
Factory metod je metod koji vraća instancu klase. O factory metodu ćemo govoriti kasnije.
U ovom primjeru, ako kreiramo instancu klase Rectangle, biće pozvan draw() metod klase Rectangle.

abstract class Shape{  
abstract void draw();  
}  
//U stvarnom scenariju, implementaciju obezbjeđuje neko drugi tj. ona je nepoznata krajnjem korisniku  
class Rectangle extends Shape{  
void draw(){System.out.println("drawing rectangle");}  
}  
  
class Circle1 extends Shape{  
void draw(){System.out.println("drawing circle");}  
}  
  
//U stvarnom scenariju, metod poziva programer ili korisnik  
class TestAbstraction1{  
public static void main(String args[]){  
Shape s=new Circle1();  //U stvarnom scenariju, objekt obezbjeđuje metod napr. getShape() metod  
s.draw();  
}  
}
Ispis na ekranu:
drawing circle

Drugi primjer apstraktne klase u javi

abstract class Bank{    
abstract int getRateOfInterest();    
}    
    
class SBI extends Bank{    
int getRateOfInterest(){return 7;}    
}    
class PNB extends Bank{    
int getRateOfInterest(){return 7;}    
}    
    
class TestBank{    
public static void main(String args[]){    
Bank b=new SBI();  //ako je objekt PNB, biće pozvan metod od PNB    
int interest=b.getRateOfInterest();    
System.out.println("Rate of Interest is: "+interest+" %");    
}}
Ispis na ekranu:
Rate of Interest is: 7 %

Apstraktna klasa koja ima konstruktor, podatak-član, metode itd.
Apstraktna klasa može imati podatak-član, apstraktni metod, tijelo metoda, konstruktor i čak main() metod.

//primjer apstraktne klase koja ima tijelo metoda  
 abstract class Bike{  
   Bike(){System.out.println("bike is created");}  
   abstract void run();  
   void changeGear(){System.out.println("gear changed");}  
 }  
  
 class Honda extends Bike{  
 void run(){System.out.println("running safely..");}  
 }  
 class TestAbstraction2{  
 public static void main(String args[]){  
  Bike obj = new Honda();  
  obj.run();  
  obj.changeGear();  
 }  
}
Ispis na ekranu:
 bike is created
       running safely..
       gear changed    

Pravilo: Ako postoji bar jedan apstraktni metod u klasi, ta klasa mora biti apstraktna.

  abstract void run();  

  }

  Ispis na ekranu:
compile time error  

Pravilo: Ako nasljeđujemo bilo koju apstraktnu klasu koja ima apstraktni metod, moramo obezbijediti implementaciju tog metoda ili učiniti tu klasu apstraktnom.

Još jedan stvarni scenario za apstraktnu klasu
Apstraktna klasa može takođe biti upotrijebljena da obezbijedi neke implementacije interfejsa. U tom slučaju, krajnji korisnik ne mora biti prinuđen da preklopi sve metode interfejsa.

Napomena 1: Početnik u javi , neka prvo pročita poglavlje o interfejsu.

   
interface A{  
void a();  
void b();  
void c();  
void d();  
}  
  
abstract class B implements A{  
public void c(){System.out.println("I am C");}  
}  
  
class M extends B{  
public void a(){System.out.println("I am a");}  
public void b(){System.out.println("I am b");}  
public void d(){System.out.println("I am d");}  
}  
  
class Test5{  
public static void main(String args[]){  
A a=new M();  
a.a();  
a.b();  
a.c();  
a.d();  
}}

Ispis na ekranu:
I am a
I am b
I am c
I am d


Objektno orijentisano programiranje u Javi    Index