Interfejsy
I nterfejs w rozumieniu jakie za chwilę poznamy może się w pierwszej kolejności mylić z pojęciem interfejsu użytkownika, czyli graficznym dostępem do różnych funkcji programu. W naszym przypadku będzie do szkielet, albo bardziej szczegółowo wymóg jaki będą musiały spełniać klasy implementujące nasz interfejs.
Składnia interfejsu jest następująca:
[specyfikator_dostępu] interface nazwa_interfejsu {
elementy_interfejsu...
}
Przykładowo wyobraźmy sobie interfejs pojazd:
public interface Pojazd {
public void jazda(int predkosc);
public void stop();
}
Jak widać dziwne jest w nim to, że posiada dwie metody typu void: jazda() i stop() , ale jak widać nie posiadają one żadnej implementacji, ani nawet nawiasów klamrowych. Tak jak powiedzieliśmy wcześniej, interfejs to kontrakt, który mówi co klasa implementująca może robić, ale nie jak ma to robić.
W naszym przykładzie łatwo sobie wyobrazić klasy Samochód i Rower - obie przedstawiają pojazdy, jednak znacznie się różniące i posiadające jedynie wspólne cechy w zakresie poruszania się (no i może paru innych, ale nie wnikajmy w szczegóły). Jeśli klasy Samochód i Rower będą implementowały interfejs pojazd to będziemy pewni, że będą one mogły się poruszać i zatrzymywać, dzięki metodom jazda() i stop().
public class Samochod implements Pojazd {
@Override
public void jazda(int predkosc) { }
@Override
public void stop() { }
public void drift() { }
}
public class Rower implements Pojazd {
@Override
public void jazda(int predkosc) { }
@Override
public void stop() { }
public double skok() { }
}
Jak widać nasze klasy implementując interfejs Pojazd muszą implementować jego metody (pomocna jest tutaj adnotacja @Override). Nie jest jednak powiedziane, że nie mogą również posiadać własnych dodatkowych metod specyficznych tylko dla siebie, jak na przykład skok() określająca wysokość na jaką skoczyliśmy na rowerze, czy drift() wprawiająca samochód w poślizg. Dodawanie własnych metod nie jest jednak dobrym podejściem, ponieważ tracimy w ten sposób nieco możliwości jakie niesie ze sobą polimorfizm - aby móc korzystać z metod, których nie ma w interfejsie zarówno typ referencji jak i typ obiektu muszą być zgodne - użycie interfejsu wydaje się wtedy zbędne.
Wszystkie metody interfejsu są domyślnie publiczne i abstrakcyjne, nie jest więc konieczne dopisywanie przed nimi tych słów kluczowych, jeśli o tym zapomnimy, nic się nie stanie.
Wszystkie pola interfejsu muszą być zadeklarowane jako publiczne, statyczne i finalne, czyli innymi słowy, w interfejsie możemy także umieszczać stałe pola. Nie muszą być jednak oznaczone słowami final i static, podobnie jak w przypadku metod są one tam dodawane automatycznie
Inne wymagania co do interfejsów w skrócie:
- Interfejs musi być utworzony przy użyciu słowa kluczowego interface
- Interfejsy mogą być wykorzystywane polimorficznie, tzn można ich używać jako typu ogólniejszego klas, które go implementują, poprawne zapisy na podstawie powyższych przykładów to:
Pojazd rower = new Rower();
Pojazd samochod = new Samochod();
- Interfejs może rozszerzać (extends) tylko interfejsy (nawet kilka, co w przypadku klas jest zabronione)
- Metody interfejsu nie mogą być zadeklarowane jako statyczne
To co ważne, w Javie niedozwolone jest dziedziczenie wielokrotne, jednak jak najbardziej poprawne jest implementowanie wielu interfejsów, przydatność tego rozwiązania zobaczymy w szczególności w przypadku programowania aplikacji z graficznym interfejsem użytkownika, gdzie dodatkowo będziemy obsługiwali zdarzenia generowane przez mysz, lub klawiaturę.
Dyskusja i komentarze
Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.
Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.
s4ncho
nie wiem czy przeoczylem wytłumaczenie czy go nei bylo. "Polimorfizm (z gr. wielopostaciowość) - mechanizmy pozwalające programiście używać wartości, zmiennych i podprogramów na kilka różnych sposobów[1]. Inaczej mówiąc jest to możliwość wyabstrahowania wyrażeń od konkretnych typów[2]." Źródło: http://pl.wikipedia.org/wiki/Polimorfizm_(informatyka)
Slawek
Dwie kolejne lekcje będą o klasach abstrakcyjnych i polimorfizmie.
Jarek
Mam pytanie, co oznacza (co robi?, co wywołuje?) znak '@' w programowaniu w JAVIE ? Dzięki, pozdro.
Jędrzej
Mi się wydaje że info dodatkowe dla kompilatora??? Sławku wzywam cię na pomoc nieudolnym programistom!☺!
Slawek
Przez @ oznacza się specjalne meta dane, które obecnie są standardem uzupełniającym javę. Jest to zagadnienie, na które potrzeba by co najmniej osobnej lekcji, a wykracza poza ramy podstaw. Jeżeli ktoś jest zainteresowany to na razie odsyłam do książek i google z pojęciami "adnotacje", lub "annotations".
Assa
@ oznacza użycie dekoratora, taki bajerancki element składni :P
jarek9248@o2.pl
Dzięki Assa. Jak długo żyję, to nie widziałem tak "udolnego i zdolnego" programisty jak Jędrzej, który nie zdołał pojąć, że to kurs dla początkujących, a nie dla wyśmienitych i nie potrzebujących żadnej pomocy ... Przykro, że na poważnych stronkach i tacy się znajdują dlatego najlepiej opuścić to miejsce ... :-((
kris_IV
Chyba go źle odebrałeś :-) Sam nie był pewny udzielanej odpowiedzi, a sformułowanie "wzywam na ratunek" było raczej na kształt wezwania superbohatera.
Harry
Witam, Pod koniec lekcji jest napisane: "Interfejs może implementować inny interfejs". To chyba raczej niemożliwe, żeby interfejs implementował interfejs, skoro jak dobrze rozumiem interfejs zawiera same deklaracje funkcji oraz stałe?
Slawek
Dobra uwaga, dzięki.
ribbon
Interfejs nie może implementować innego interfejsu. Klasa może implementować interfejs poprzez definicję metod interfejsu. W lekcji nie ma zdania, że „Interfejs może implementować inny interfejs”. Jest natomiast uwaga, że ,,Interfejs może rozszerzać (extends) tylko interfejsy (nawet kilka, co w przypadku klas jest zabronione)". Autorze kursu nie popełniłeś błędu. Harry myślał chyba o implementowaniu wielu interfejsów przez klasę, a nie interfejs. Mam już dość pisania o interfejsach :P
Slawek
Błąd został wcześniej poprawiony, dlatego go już nie ma :) Dzięki Harremu jeszcze raz za uwagę.
Kuba
Witam, mam pewien problem, który wygląda następująco: kiedy wpisuję w klasie samochód lub rower public void jazda () {} wyswietla mi si błąd i przy public double skok() {} ?
shofer
Jest mały aczkolwiek istotny błąd. W interfejsie Pojazd jest metoda jazda(int predkosc); która jako argument ma prędkość. Natomiast w klasie samochód i rower, gdzie implementujesz interfejs pojazd, metody jazda jest bezargumentowa.
Sławek Ludwiczak
Dzięki, poprawione.
Mateusz
Witam. Gdy zainstalowałem jave JDK patrzę do folderu ze zainstalowaną javą i jest tam folder tylko jre8 a niema JDK ! Pomocy
evox95
pewnie masz win7 64bit JDK szukaj w 'Program Files' a nie w 'Pliki Programów (x86)' ;)
DjCoraxa
public class Rower implements Pojazd { @Override public void jazda(int predkosc) { } @Override public void stop() { } public double skok() { } } O ile się orientuje, metona skok powinna miec na koncu "return (zmienna typu double);" nie ?
bartek
Nie bardzo zrozumiałem jaka jest idea interfejsu ? Co mi to daje takiego ekstra w porównaniu do dwóch klas Rower i Samochód
Sławek Ludwiczak
Dowiesz się m.in. w lekcji dotyczącej polimorfizmu. Najprostsza zaleta jest taka, że możesz przykładowo utworzyć tablicę obiektów, która przechowuje zarówno rowery jak i samochody, a nie tylko albo jedne albo drugie z nich.