Interfejs to „szablon” zawierający elementy, które muszą być użyte w klasach, które go zaimplementują. Interfejsy mogą zawierać tylko stałe i deklaracje metod. Implementacja interfejsu w danej klasie odbywa się za pomocą słowa kluczowgo implements.
Konstrukcja interfejsu:
1 2 3 |
modyfikator_dostepu interface Nazwa_interfejsu { // deklaracja stałych i/lub metod } |
Implementacja interfejsu:
1 2 3 |
modyfikator_dostepu class Nazwa_klasy implements Nazwa_interfejsu { // deklaracja składowych i/lub metod } |
W odróżnieniu od dziedziczenia dana klasa może implementować wiele interfejsów:
1 2 3 |
modyfikator_dostepu class Nazwa_klasy implements Interfejs1, Interfejs2 // itd... { // kod klasy } |
Interfejsy mogą również dziedziczyć po wielu interfejsach:
1 2 |
modyfikator_dostepu interface Nazwa_interfejsu extends Interfejs1, Interfejs2 //... { } |
Przykład interfejsu:
1 2 3 4 5 6 |
public interface FiguraGeometryczna { double Pole(); double Obwod(); } |
Zwróć uwagę, że interfejs FiguraGeometryczna mówi klasie „co ma zrobić”, ale nie mówi w jaki sposób ma to zrobić. Mamy tylko deklaracje nazw metod: Pole() i Obwod(). Wszystkie stałe i metody interfejsu są domyślnie publiczne i abstrakcyjne dlatego nie jest wymagane pisanie przed nimi słów kluczowych np: public.
Analizując ten prosty interfejs możemy z łatwością domyślić się, że będzie on kazał klasie obliczyć pole i obwód danej figury geometrycznej.
Napiszmy więc klasę Kwadrat i wprowadźmy do niej odpowiednie wzory:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class Kwadrat implements FiguraGeometryczna { private double a; // długość boku / podstawy public void setA(double a) { this.a = a; } public double getA() { return a; } public double Pole() { return a*a; } public double Obwod() { return 4*a; } } |
Obie metody (Pole i Obwod) zwracają wynik działania. Dodajmy jeszcze jedną figurę – prostokąt. Klasa Prostokat, podobnie jak Kwadrat implementuje interfejs FiguraGeometryczna.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public class Prostokat implements FiguraGeometryczna { private double a; // długość private double h; // wysokość public void setA(double a) { this.a = a; } public double getA() { return a; } public void setH(double h) { this.h = h; } public double getH() { return h; } public double Pole() { return a*h; } public double Obwod() { return 2*a+2*h; } } |
Klasy Kwadrat i Prostokat muszą zaimplementować wszystkie metody interfejsu FiguraGeometryczna, ale nic nie stoi na przeszkodzie, aby posiadały dodatkowe metody wewnątrz własnych klas np: wzór na przekątną.
Na koniec stwórzmy klasę testującą nasz program – FiguraGeometrycznaTest:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class FiguraGeometrycznaTest { public static void main(String[] args) { Kwadrat zadanie = new Kwadrat(); zadanie.setA(10); System.out.println("Pole kwadrata = " + zadanie.Pole()); System.out.println("Obwód kwadrata = " + zadanie.Obwod()); Prostokat zadanie2 = new Prostokat(); zadanie2.setA(5); zadanie2.setH(2); System.out.println("Pole prostokąta = " + zadanie2.Pole()); System.out.println("Obwód prostokąta = " + zadanie2.Obwod()); // Wyświetli: // Pole kwadratu = 100.0 // Obwód kwadratu = 40.0 // Pole prostokąta = 10.0 // Obwód prostokąta = 14.0 } } |
Czytaj dalej: PRZECIĄŻANIE METOD →