Interfejs u Javi

Interfejs u Javi je nacrt (blueprint) klase. On ima samo statičke konstante i apstraktne metode.
Interfejs u javi je mehanizam za postizanje potpune apstrakcije. U Java interfejsu mogu postojati samo apstraktni metodi bez tela metoda. On se koristi za postizanje pune apstrakcije i višestrukog nasleđivanja u Javi.
Java Interfejs takođe predstavlja IS-A relaciju.
On ne može biti instanciran kao ni apstraktna klasa.

Zašto se koristi interfejs?
Postoje uglavnom tri razloga za upotrebu interfejsa. To su:

  • Koristi se za postizanje pune apstrakcije.
  • Pomoću interfejsa, moguće je podržati funkcionalnost višestrukog nasleđivanja.
  • Može se koristiti za postizanje tzv. labavog spajanja (loose coupling).

Napomena 1: Java kompajler dodaje ključne reči public i abstract pre metoda interfejsa i ključne reči public, static i final pre podataka-članova.
Drugim rečima, polja interfejsa su public, static i final po default-u, a metodi su public i abstract.

Razumevanje odnosa između klasa i interfejsa
Kao što je prikazano na sledećoj slici, klasa nasleđuje drugu klasu, interfejs nasleđuje drugi interfejs ali klasa implementira interfejs.

Jednostavan primer Java interfejsa
U ovom primeru, interfejs Printable ima samo jedan metod, njegova implementacija je obezbeđena u klasi A.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
interface printable{ 
void print(); 
  
class A6 implements printable{ 
public void print(){System.out.println("Hello");} 
  
public static void main(String args[]){ 
A6 obj = new A6(); 
obj.print(); 
 
}
Ispis na ekranu:
Hello

Višestruko nasleđivanje u Javi pomoću interfejsa

Ako klasa implementira više interfejsa, ili interfejs nasleđuje više interfejsa to je poznato kao višestruko nasleđivanje (multiple inheritance).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface Printable{ 
void print(); 
  
interface Showable{ 
void show(); 
  
class A7 implements Printable,Showable{ 
  
public void print(){System.out.println("Hello");} 
public void show(){System.out.println("Welcome");} 
  
public static void main(String args[]){ 
A7 obj = new A7(); 
obj.print(); 
obj.show(); 
 
}
Ispis na ekranu:
Hello
Welcome

Zašto višestruko nasleđivanje nije podržano preko klasa u Javi ali je moguće pomoću interfejsa?
Kao što je rečeno u poglavlju o nasleđivanju, višestruko nasleđivanje nije podržano u slučaju klasa. Međutim, podržano je u slučaju interfejsa zato što nema dvosmislenosti jer je implementacija obezbeđena preko implementacione klase. Na primer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
interface Printable{ 
void print(); 
  
interface Showable{ 
void print(); 
  
class testinterface1 implements Printable,Showable{ 
  
public void print(){System.out.println("Hello");} 
  
public static void main(String args[]){ 
testinterface1 obj = new testinterface1(); 
obj.print(); 
 
}
Ispis na ekranu:
Hello

Kao što se može videti u ovom primeru, Printable i Showable interfejs imaju iste metode ali njihovu implementaciju obezbeđuje klasa A, tako da nema dvosmislenosti.

Nasleđivanje interfejsa

Klasa implementira interfejs ali jedan interfejs nasleđuje drugi interfejs.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
interface Printable{ 
void print(); 
interface Showable extends Printable{ 
void show(); 
class Testinterface2 implements Showable{ 
public void print(){System.out.println("Hello");} 
public void show(){System.out.println("Welcome");} 
  
public static void main(String args[]){ 
Testinterface2 obj = new Testinterface2(); 
obj.print(); 
obj.show(); 
 
}
Ispis na ekranu:
Hello
Welcome

Šta je marker ili tagovani interfejs?

Interfejs koji nema članova je poznat kao marker ili tagovani interfejs. Na primer: Serializable, Cloneable, Remote itd. Oni se koriste da obezbede neke suštinske informacije za JVM tako da JVM može izvoditi neke korisne operacije.

1
2
3
// Kako je napisan interfejs Serializable? 
public interface Serializable{ 
}

Ugnježđeni (nested) interfejs u Javi

Napomena 2: Jedan interfejs može imati drugi interfejs i to je poznato kao ugnježđeni interfejs. Na primer:

1
2
3
4
5
6
interface printable{ 
 void print(); 
 interface MessagePrintable{ 
  void msg(); 
 
}

Comments

comments