Az interfaces a legfőbb módja annak, hogy leválasszuk egy osztály használatát a megvalósításáról.
Ez a leválasztás rugalmasságot ad a megvalósítás karbantartásához, és segít támogatni a típusbiztos, generikus viselkedést.
Az interfész szintaxisa hasonlít az osztályéhoz, azzal a különbséggel, hogy a metódusok csak szignatúraként jelennek meg, törzs nélkül.
public interface Language {
String speak();
}
public interface ItalianLanguage extends Language {
String speak();
String speakItalian();
}
public interface ScriptConverter {
void setVersion(String version);
String getVersion();
String convertCyrillicToLatin(String cyrillic);
}
A megvalósító osztálynak minden műveletet meg kell valósítania, amelyet az interfész definiál.
Az interfészek jellemzően az alábbiak közül egyet vagy többet tesznek lehetővé:
Comparable<T>)public class ItalianTraveller implements ItalianLanguage {
public String speak() {
return "Ciao mondo";
}
public String speakItalian() {
return speak();
}
}
public class ItalianTravellerV2 implements ItalianLanguage {
public String speak() {
return "migliorata - Ciao mondo";
}
public String speakItalian() {
return speak();
}
}
public class FrenchTraveller implements Language {
public String speak() {
return "Ça va?";
}
}
public class RussianTraveller implements Language, ScriptConverter {
private String version;
public void setVersion(String version) {
this.version = version;
}
public String getVersion() {
return version;
}
public String speak()
{
return "Привет мир";
}
public String convertCyrillicToLatin(String cyrillic) {
throw new UnsupportedOperationException();
}
}
public class DocumentTranslator implements ScriptConverter {
private String version;
public void setVersion(String version) {
this.version = version;
}
public String getVersion() {
return version;
}
public String translate(String russian) {
throw new UnsupportedOperationException();
}
public String convertCyrillicToLatin(String cyrillic) {
throw new UnsupportedOperationException();
}
}
A fenti interfészeket és osztályokat használó kód a következőket teheti:
Az interfészeket széles körben használják a tesztelés támogatására, mert megkönnyítik a mockolást.
Az interfészek az extend kulcsszóval kiterjeszthetnek más interfészeket.
Az interfész tagjai alapértelmezés szerint public láthatóságúak.
Az interfészek tartalmazhatnak egymásba ágyazott típusokat: interfaces, enums és classes.
Itt a tartalmazó interfészek névtérként szolgálnak.
Az egymásba ágyazott típusokhoz az interfészen kívülről úgy férünk hozzá, hogy az interfész nevét elé írjuk, és pont szintaxissal azonosítjuk a tagot.
A Java tervezésénél fogva nem támogatja a többszörös öröklődést, de az interfészeken keresztül lehetővé tesz egyfajta többszörös öröklődést.
Ráadásul az egész interfészmechanizmus alapja az a fogalom, hogy a polimorfizmus interfészeken keresztül is megvalósítható.