Interfejs jest czymś podobnym do klasy. Jego podstawowe cechy charakterystyczne, to:
- wszystkie jego metod muszą być abstrakcyjne;
- wszystkie jego metody są publiczne i abstrakcyjne;
- jeśli posiada pola danych, to są one domyślnie publiczne, finalne i statyczne (ang. public, final i static) co oznacza, że są stałymi;
- może dziedziczyć z innych interfejsów, ale nie może dziedziczyć z klas;
- opisuje zbiór właściwości, które potomna klasa musi implementować.
Definicja interfejsu wygląda następująco:
[modyfikator] interface NazwaInterfejsu [extends ListaInterfejsów]
{
. . .
}
Relację dziedziczenia przez klasę z interfejsu wyrażamy za pomocą słów kluczowego implements.
Każda klasa implementująca interfejs, musi posiadać definicję wszystkich metod zadeklarowanych
w interfejsie. Jeśli choć 1 metoda nie będzie zadeklarowane w klasie, to klasa będzie klasą abstrakcyjną.
Możliwe jest implementowanie przez klasę wielu interfejsów. Mechanizm implementacji interfejsów
rozwiązuje problem podobny do wielodziedziczenia klas Nie jest to jednak prawdziwa wielodziedzicznie, gdyż:
- nie można dziedziczyć zmiennych z interfejsu;
- nie można dziedziczyć implementacji metod;
- hierarchia interfejsu jest niezależna od hierarchii klas; klasy które implementują ten sam interfejs mogą zarówno być, jaki i nie być powiązane przez hierarchię klas, co nie jest prawdą w przypadku wielodziedziczenia.