Apstraktna klasa u Javi

Apstraktna klasa u Javi

Klasa koja je deklarisana ključnom rečju abstract, je poznata kao apstraktna klasa u Javi. Ona može imati apstraktne i ne-apstraktne metode (metode sa telom).
Pre 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 rečima, korisniku se pokazuju samo važne stvari, a unutrašnji detalji ostaju skriveni. Npr. 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 šta to objekat radi, umesto 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 nasleđena i njen metod implementiran. Ona ne može biti instancirana.
Apstraktna klasa je neka vrsta fantomske klase. Ona može prosleđivati metode i promenljive, ali sama nikada ne može biti instancirana, tj. nije moguće kreirati objekat 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 primenjen na svaki apstraktni metod.
Apstraktne klase se ponašaju kao „držači mesta“ (placeholderi) u hijerarhiji klasa. Na primer, apstraktna klasa može sadržavati delimičnu deskripciju koju nasleđuju svi njeni potomci u hijerarhiji klasa. Njena deca, koja su mnogo određenija, popunjavaju praznine.
Apstraktni metod nikada ne može biti static.

Primer apstraktne klase

abstract class A{}

Apstraktni metod

Metod koji je deklarisan kao apstraktan i koji nema implementaciju se naziva apstraktni metod.

Primer apstraktnog metoda

1
abstract void printStatus();  //nema tela i ima abstract

Primer apstraktne klase koja ima apstraktni metod

U ovom primeru, apstraktna klasa Bike sadrži samo jedan apstraktni metod run. Njegovu implementaciju obezbeđuje klasa Honda.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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..

Razumevanje stvarnog scenarija apstraktne klase

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
abstract class Shape{ 
abstract void draw(); 
//U stvarnom scenariju, implementaciju obezbeđ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, objekat obezbeđuje metod napr. getShape() metod 
s.draw(); 
}
Ispis na ekranu:
drawing circle

Drugi primer apstraktne klase u Javi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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, telo metoda, konstruktor i čak main() metod.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//primer apstraktne klase koja ima telo 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.

1
2
3
4
5
6
  abstract void run(); 
 
  }
 
  Ispis na ekranu:
compile time error 

Pravilo: Ako nasleđujemo bilo koju apstraktnu klasu koja ima apstraktni metod, moramo obezbediti 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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

Comments

comments

Close Menu
Show Buttons
Hide Buttons