Vmesniki predstavljajo poleg abstraktnih razredov še enega izmed načinov abstrakcije. Vmesnik je v bistvu razred, katerega vsi člani so bodisi abstraktni (abstract), bodisi končni(final). Vse metode in lastnosti v vmesniku morajo pri tem vedno biti javne. Razlika med vmesnikom in abstraktnim razredom je v tem, da vmesnik ni nujno abstrakten (lahko ne vsebuje nobene abstraktne metode).
V nasprotju z razredom lahko vmesnik dodamo razredu (definiciji razreda; pojavno tudi dedovanje tako ni nič drugega kot dodajanje definicij podedovanega razreda), ki je že podrazred nekega drugega razreda (ki že deduje nek razred).
Nadalje: vmesnik lahko vpliva na člane večih različnih razredov. Za primer definirajmo vmesnik Ploscina
z eno samo metodo izracunajPloscino()
:
public interface Ploscina { public double izracunajPloscino(); }
Ta vmesnik bi lahko uporabili v večih različnih razredih, med drugim za npr. kvadrat, trikotnik, dvanajstkotnik, ..., pa konec koncev tudi za razrede, kot so kvader, stožec, ..., ali pa avto, stanovanje, ...
Nepriročno bi bilo, da bi vse objekte teh razredov izvedli iz enega samega razreda in s tem zagotovili vsebovanost metode za izračun ploščine..
Kakorkoli, vsak od teh različnih tipov bo verjetno vseboval lastno metodo za izračun ploščine, ki se bodo med seboj lahko razlikovale. Torej definiramo vmesnik Ploscina
in 'prisilimo' vsakega izmed razredov, da implementira metode vmesnika Ploscina
.
Struktura in sintaksa vmesnika sta preprosti, v principu enaki tisti, ki smo jo srečevali pri razredih:
public interface Ploscina {...}
Vmesnik Ploscina
mora biti public (javno dostopen), da do njegove vsebine lahko dostopamo iz poljubnega razreda. Lahko določimo, da je vmesnik zaščiten (protected); pri tem bo ta vmesnik dostopen le v razredih paketa (package), kjer je implementiran tudi vmesnik. Ta zadnji primer ni ravno običajen:. praktično vsi vmesniki so . Noben izmed vmesnikov ne sme biti privaten : konec koncev je namen vmesnikov, da bi bili podedovani s strani različnih razredov.
Ključna besedica interface
v deklaraciji nadomesti ključno besedico
class.
Vmesnik lahko vsebuje motode, kot jih vsebuje tudi običajni razred. Metode niso realizirane in so podane le s svojimi prototipi (vsebuje le deklaracijo metode, ne pa tudi telesa te metode). Tako so vse metode v vmesniku abstraktne. Implementacija metode je torej naloga razreda, ki implementira vmesnik s tako metodo:
public double izracunajPloscino();
V vmesniku lahko definiramo poljubno število metod . Te metode morajo v razredu, ki implementira vmesnik, biti preobložene. V primeru, da preobložitve ne izvršimo, ostane razred abstrakten.
Vmesnik lahko vsebuje tudi lastnosti (podatkovna polja). Če jih vsebuje, morajo vsa podatkovna polja biti vrste final (končna) in static(statična).
Da bi uporabili vmesnik, ustvarimo razred, ki vsebuje realizacijo metode za izračun ploščine public double
izracunajPloscino()
in povemo razredu, da mora implementirati vmesnik Ploscina
:
public class Kvadrat extends Lik implements Ploscina { int a = 4; public double izracunajPloscino() { return a*a; } }
Ena izmed prednosti vmesnikov pred razredi je, da en sam razred lahko implementira več kot en sam vmesnik.Spodnji primer npr. kaže, kako razred Kvadrat implementira vmesnike: Ploscina
, Serializable
, in Cloneable
Ploscina java.io.*; public class Kvadrat extends Lik implements Ploscina, Serializable, Cloneable { int a = 4; public double izracunajPloscino() { return a*a; } }
Serializable
in Cloneable
sta označevalna vmesnika (marker interfaces) iz knjižnjice razredov, ki dodata le definicijo tipov v razred, ne deklarirata pa nobenih dodatnih metod.