Wprowadzenie do interfejsów
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 34 z 87.
Widziałeś już, jak klasy abstrakcyjne definiują kontrakty, których podklasy muszą przestrzegać. Ale co, jeśli chcesz, aby klasa przestrzegała wielu kontraktów? Java nie pozwala klasie dziedziczyć po wielu klasach, ale rozwiązuje ten problem za pomocą interfejsów.
Interfejs to kontrakt, który określa, co może robić klasa, bez określania, jak to robi. W przeciwieństwie do klas abstrakcyjnych interfejsy zawierają wyłącznie sygnatury metod (domyślnie), bez implementacji:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}Myśl o interfejsie jak o obietnicy. Gdy klasa implementuje interfejs, obiecuje dostarczyć implementacje wszystkich metod zadeklarowanych w tym interfejsie. Interfejs definiuje możliwości, a klasa zapewnia zachowanie.
Interfejsy deklaruje się za pomocą słowa kluczowego interface zamiast class. Wszystkie metody w interfejsie są niejawnie public i abstract, więc nie musisz zapisywać tych słów kluczowych:
public interface Playable {
void play(); // domyślnie public abstract
void pause();
void stop();
}Interfejsy mogą również deklarować stałe, które są niejawnie public static final:
public interface GameConstants {
int MAX_PLAYERS = 4; // domyślnie public static final
}W następnej lekcji dowiesz się, jak klasy implementują interfejsy za pomocą słowa kluczowego implements.
Wyzwanie
ŁatwyZbudujmy system sterowania urządzeniami, definiując interfejsy opisujące możliwości różnych urządzeń. To wyzwanie koncentruje się na tworzeniu interfejsów: kontraktów, które określają możliwości bez wskazywania, jak są realizowane.
Rozmieścisz swój kod w trzech plikach:
Switchable.java: Utwórz interfejs definiujący, co oznacza, że urządzenie można włączać i wyłączać. Każde urządzenie, które można przełączać, powinno dać się włączyć i wyłączyć. Zadeklaruj dwie metody:turnOn()iturnOff(). Pamiętaj, że metody interfejsu są domyślniepubliciabstract, więc wystarczy podać ich sygnatury.Adjustable.java: Utwórz kolejny interfejs definiujący, co oznacza, że urządzenie można regulować. Powinna istnieć możliwość ustawienia jego poziomu. Zadeklaruj metodęsetLevel(int level). Dodaj też stałąMAX_LEVELo wartości100: pamiętaj, że stałe w interfejsach są domyślniepublic static final.Main.java: Pokaż, że interfejsy są prawidłowo zdefiniowane, wypisując informacje na ich temat. Otrzymasz jedno wejście: wartość poziomu (int). Wypisz następujące trzy wiersze:Switchable methods: turnOn, turnOffAdjustable methods: setLevelMax level constant: [MAX_LEVEL value](uzyskaj dostęp do stałej z interfejsu Adjustable)
Setting level to: [input level]
Otrzymasz jedno wejście: wartość poziomu (int).
To wyzwanie koncentruje się wyłącznie na definiowaniu interfejsów: szablonów opisujących możliwości. W następnej lekcji dowiesz się, jak klasy implementują te interfejsy, aby zapewnić rzeczywiste działanie!
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int level = scanner.nextInt();
// TODO: Wypisz informacje o interfejsach
// Wypisz: "Switchable methods: turnOn, turnOff"
// Wypisz: "Adjustable methods: setLevel"
// Wypisz: "Max level constant: ", a po nim wartość Adjustable.MAX_LEVEL
// Wypisz: "Setting level to: ", a po nim wprowadzoną wartość level
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online