Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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() i turnOff(). Pamiętaj, że metody interfejsu są domyślnie public i abstract, 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_LEVEL o wartości 100: pamiętaj, że stałe w interfejsach są domyślnie public 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, turnOff
    • Adjustable methods: setLevel
    • Max level constant: [MAX_LEVEL value] (uzyskaj dostęp do stałej z interfejsu Adjustable)
    Następnie wypisz: 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
        
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Java online