Implementowanie interfejsów
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 35 z 87.
Aby użyć interfejsu, klasa musi go implementować za pomocą słowa kluczowego implements. Klasa zapewnia następnie konkretne implementacje wszystkich metod zadeklarowanych w interfejsie:
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Drawing a circle with radius " + radius);
}
}Jeśli klasa implementuje interfejs, ale nie dostarcza implementacji wszystkich jego metod, kompilator zgłosi błąd. Adnotacja @Override jest opcjonalna, ale zalecana, ponieważ pomaga wykrywać pomyłki.
Podobnie jak w przypadku klas abstrakcyjnych, możesz używać interfejsu jako typu referencyjnego. Umożliwia to polimorfizm, w którym różne klasy implementujące ten sam interfejs mogą być traktowane jednakowo:
Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);
shape1.draw(); // Rysowanie koła o promieniu 5.0
shape2.draw(); // Rysowanie prostokąta o wymiarach 4.0 x 3.0To potężne rozwiązanie, ponieważ kod działający z referencjami Drawable nie musi znać konkretnego typu klasy. Interesuje go tylko to, czy obiekt można narysować.
W następnej lekcji zobaczysz, jak pojedyncza klasa może jednocześnie implementować wiele interfejsów.
Wyzwanie
ŁatwyZbudujmy system głośników, który pokaże, jak klasy implementują interfejsy. Utworzysz interfejs definiujący, co może robić każdy głośnik, a następnie utworzysz dwa różne typy głośników, z których każdy będzie implementować ten kontrakt na swój sposób.
Rozmieścisz swój kod w czterech plikach:
Speaker.java: Zdefiniuj interfejs o nazwieSpeaker, który deklaruje, co musi potrafić każdy głośnik. Każdy głośnik powinien mieć metodęspeak(), która zwraca String. To kontrakt, który muszą spełniać wszystkie implementujące go klasy.Human.java: Utwórz klasę implementującą interfejsSpeaker. Obiekt Human ma polename(String). Dodaj konstruktor, który inicjalizuje nazwę, i zaimplementuj metodęspeak(), aby zwracała:[name] says: Hello everyone!Robot.java: Utwórz kolejną klasę implementującą interfejsSpeaker. Obiekt Robot ma polemodel(String). Dodaj konstruktor, który inicjalizuje model, i zaimplementuj metodęspeak(), aby zwracała:Robot [model] says: Beep boop!Main.java: Połącz wszystkie elementy, wykorzystując polimorfizm oparty na interfejsie. Otrzymasz dwa dane wejściowe: imię człowieka i model robota. Utwórz obiekt Human i obiekt Robot, a następnie umieść je w tablicy referencji typuSpeaker. Przejdź przez tablicę i wypisz wynik wywołaniaspeak()dla każdego głośnika.
Otrzymasz dwa dane wejściowe: imię człowieka (String) i model robota (String).
Wynik powinien zawierać dwa wiersze: po jednym dla każdego głośnika. Zwróć uwagę, że zarówno Human, jak i Robot mogą być traktowane jednolicie za pośrednictwem interfejsu Speaker, mimo że mówią na zupełnie różne sposoby!
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Wczytaj dane wejściowe
String humanName = scanner.nextLine();
String robotModel = scanner.nextLine();
// TODO: Utwórz obiekt Human o podanym imieniu
// TODO: Utwórz obiekt Robot o podanym modelu
// TODO: Utwórz tablicę referencji typu Speaker zawierającą oba obiekty
// TODO: Przejdź przez tablicę i wypisz wynik speak() dla każdego obiektu Speaker
}
}
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