1. Interfejs jest odpowiednikiem klasy czysto abstrakcyjnej (czyli mającej wszystkie metody abstrakcyjne).
2. W hierarchii klas Javy można dziedziczyć po
jednej klasie (dziedziczenie jednobazowe), ale implementować dowolnie wiele interfejsów. Interfejsy powstały m.in. jako rozwiązanie problemu dziedziczenia wielobazowego, gdy w dwóch klasach bazowych istnieją dwie różne
implementacje tej samej funkcji. Którą wciągnąć do klasy pochodnej, itd.
3. Intefejs (jak nazwa wskazuje) Mówi
co klasa może robić, nie
jak. Przykładem klasycznym jest interfejs
Iterable:
zobowiązuje on autora podklasy do zaimplementowania funkcji
iterator(). Każda klasa implementująca
Iterable automatycznie zachowuje się jak kolekacja - można stosować ją np. w pętli foreach. I dla autora klasy korzystającej z twojej klasy nie ma znaczenia
co twoja klasa robi - może nawet po prostu zwracać kolejne liczby całkowite czy ciągle napis "dupa".
Generalnie deklaracja implementacji interfejsu w klasie jest kontraktem dla autora zobowiązującym go do tago, żeby klasa zachowywała się zgodnie z dokumentacją implementowanego interfejsu. W zamian jego klasa może byc użyta wszędzie tam, gdzie wystarczy posiadanie kontraktu. Przykład:
Robisz funkcję liczącą elementy w dowolnej kolekcji. Znakomita większość kolekcji implementuje właśnie 'Iterable':
public int policz(Iterable kolekcja)
{
int s = 0;
// Istnienie, konkretne parametry i konkretny typ zwracanej wartości tej funkcji
// jest zagwarantowane właśnie przez interfejs Iterable.
Iterator i = kolekcja.iterator();
while(i.hasNext())
{
s++;
i.next();
}
return s;
}
Twoja funkcja zadziała prawidłowo zawsze, gdy zostanie nakarmiona wartością implementującą Iterable. Nieważne, czy to coś już istnieje, czy zostanie dopiero napisane - byle zawierało funkcję
Iterator iterator() {...}.