CodeGym /Blog Java /Random-PL /Interfejs w Javie
John Squirrels
Poziom 41
San Francisco

Interfejs w Javie

Opublikowano w grupie Random-PL
Jak wiadomo, wszystko w Javie składa się z obiektów, a obiekty mają stan (pola) i zachowanie (zdefiniowane przez metody). Zachowanie klasy jest tym, co może powiązać ją z innymi klasami. Zachowanie może mieć różną charakterystykę i czasami wygodniejsze może być przeniesienie go poza zajęcia, zwłaszcza jeśli chodzi o interakcję ze światem zewnętrznym. Podobnie jak pilot do telewizora znajduje się poza samym „pudełkiem”. Pilot zdalnego sterowania to interfejs umożliwiający interakcję użytkownika z funkcjami telewizora. Można na przykład wyobrazić sobie klasę implementującą abstrakcyjny samolot lub helikopter. Obiekty obu klas jak większość ptaków potrafią latać i wszystkie robią to inaczej. Być może warto przenieść tę funkcję do osobnej jednostki, a wszyscy potencjalni „ulotki” zostaną odziedziczeni po tej jednostce? Jeśli znasz już klasy abstrakcyjne, możesz po prostu utworzyć klasę abstrakcyjną Flyable i „odziedziczyć” z niej klasy Copter i Plane. Co jednak w sytuacji, gdy takich nieruchomości jest kilka? Na przykład samoloty i helikoptery mogą latać, ale także podróżować na ziemi. Nawet jeśli utworzymy klasę Ride, nie możemy już do niej przypisać Copter i Plane. W końcu każda klasa Java ma tylko jedną klasę nadrzędną. Interfejs w Javie - 1Użycie interfejsów w języku Java częściowo rozwiązuje ten problem. Interfejsy w Javie definiują pewną funkcjonalność, która nie ma konkretnej implementacji, która jest następnie implementowana przez klasy korzystające z tych interfejsów. Jedna klasa może implementować wiele interfejsów. Tak naprawdę implementując interfejs w Javie deklarujemy, że nasza klasa może coś zrobić, raportujemy jej zachowanie. Przeprowadzamy już konkretną implementację zachowania na zajęciach. Więc. samolot i helikopter startują inaczej: samolot potrzebuje pasa startowego, podczas gdy helikopter zwykle startuje pionowo. Takie szczegóły najlepiej wdrożyć w klasie.

Interfejsy w Javie

Aby zdefiniować interfejs w języku Java, stosuje się słowo kluczowe interfejs. Na przykład:
interface Voice {

    void talk();
}
Powyższy interfejs nazywa się Voice . Interfejs w Javie może definiować stałe i metody, które mogą mieć implementacje lub nie. Zwykle metody interfejsu nie mają implementacji, tak jak w tym przykładzie. Metody w interfejsach bez implementacji są jak abstrakcyjne metody klas abstrakcyjnych. Metody interfejsu zwykle nie mają modyfikatorów dostępu. Jednak dostęp jest domyślnie publiczny, ponieważ celem interfejsu jest zdefiniowanie funkcjonalności dla implementacji klasy. Dlatego cała funkcjonalność powinna być otwarta do wdrożenia. Aby zaimplementować interfejs, użyj słowa kluczowego Implements podczas deklarowania klasy. Co więcej, jeśli interfejs zawiera metodę bez implementacji, to metoda ta musi zostać zaimplementowana w klasie implementującej.
public class Duck implements Voice {


@Override
public void voice() {
   System.out.println("Quack");
}


    }

Przykładowy kod interfejsu

Weźmy pełniejszy przykład. Każde (no, prawie każde) zwierzę ma zdolność wydawania dźwięków. Stwórzmy głos interfejsu Java dla tego przypadku. Posiada metodę talk() bez implementacji.
public interface Voice {
   void talk();
}
Teraz wszystkie klasy obsługujące interfejs Voice muszą mieć implementację metody talk() . Stwórzmy dwie klasy — Cat i Dog i wskażmy, że implementują one interfejs Voice . W takim przypadku, jeśli nie zaimplementujesz w nim klasy, program nie będzie działać. Wdrażanie metod jest bardzo proste. Przy wywołaniu metody talk() obiektu klasy Kot na ekranie zostanie wyświetlony tekstowy odpowiednik miau, w przypadku klasy Pies szczekanie. Do klas dodamy także gettery, settery i konstruktor.
public class Cat implements Voice {
   String name;
   String breed;
   int year;

   public Cat(String name, String breed, int year) {
       this.name = name;
       this.breed = breed;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getBreed() {
       return breed;
   }

   public void setBreed(String breed) {
       this.breed = breed;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("meow...");
   }
}
public class Dog implements Voice {
   String name;
   String color;
   int year;

   public Dog(String name, String color, int year) {
       this.name = name;
       this.color = color;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("WOF WOF");
   }
}
Tak naprawdę nasze implementacje klas i metod są bardzo podobne. Stwórzmy kolejną klasę, Parrot , z obsługą głosu . Tylko metoda talk() będzie w nim działać inaczej: użytkownik wprowadzi ciąg znaków do konsoli, a papuga „powtórzy” go za pomocą metody talk() .
import java.util.Scanner;

public class Parrot implements Voice {
   String name;
   String color;
   int year;

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       Scanner scanner = new Scanner(System.in);
       System.out.println("WHat should I repeat after you?...");
       String s =  scanner.nextLine();
       System.out.println(s);
   }
}
Stwórzmy teraz klasę testową i zobaczmy, jaki wynik uzyska program, jeśli wywołamy metodę talk() obiektów klas Cat , Dog i Parrot .
public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Parrot parrot = new Parrot();
       parrot.talk();
   }
}
Dane wyjściowe znajdują się poniżej. Zielony tekst to nazwa użytkownika wydrukowana w konsoli.
miau... WOF WOF Co mam ci powtarzać?... Jestem bardzo gadatliwym i mądrym ptakiem Jestem bardzo gadatliwym i mądrym ptakiem

Metody domyślne

Przed wydaniem JDK 8 podczas implementowania interfejsu w Javie musieliśmy zaimplementować wszystkie jego metody w klasie. Jednocześnie sam interfejs Java mógłby zawierać jedynie definicje metod bez konkretnej implementacji. JDK 8 dodaje nową funkcjonalność — metody domyślne. Teraz interfejsy Java mogą mieć nie tylko definicje metod, ale także domyślne implementacje. Są używane, jeśli klasa implementuje interfejs, ale nie implementuje metody. Na przykład zmieńmy metodę talk() w interfejsie Voice na metodę domyślną. Napiszemy także nową klasę Duck z obsługą głosu , która nie będzie posiadała implementacji metody talk .
public interface Voice {
   default void talk() {
       System.out.println("I can talk...");
   }
}
public class Duck implements Voice {

   public void moveForward() {
       System.out.println(" Quack, I am moving forward...");
   }

   public void TurnRight(){
       System.out.println("I am turning right...");
   }
   public void TurnLeft(){
       System.out.println("I am turning left...");

   }

   public void Stop() {
       System.out.println("Quack. I am relaxing on the surface of the water...");
   }

   public void fly(){
       System.out.println("I am flying!!!");
   }

}
Zmieńmy teraz trochę naszą klasę testową.
public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Duck duck = new Duck();
       duck.talk();
   }
}
Dane wyjściowe są tutaj:
miau... WOF WOF Mogę mówić...
Widzieć? W obiektach klas Pies i Kot wywoływana jest przesłonięta metoda talk() , natomiast w obiekcie klasy Duck wywoływana jest domyślna metoda z interfejsu. Zatem metoda domyślna jest po prostu metodą bez modyfikatorów i jest oznaczona słowem kluczowym default. Nie musimy implementować metody domyślnej w klasie implementującej interfejs, ale możemy ją zastąpić.

Metody statyczne

Ponieważ metody statyczne JDK 8 są dostępne w interfejsach Java — są one podobne do metod klasowych:
interface Voice {

    void talk();

    static void check(){

        System.out.println("checked...");
    }
}
Aby odwołać się do statycznej metody interfejsu, podobnie jak w przypadku klas, należy wpisać nazwę interfejsu i metodę:
public static void main(String[] args) {

    Voice.check();
}

Wielokrotna implementacja interfejsów

Jeśli potrzebujemy zastosować kilka interfejsów w klasie Java, wówczas wszystkie są wymienione z przecinkiem po słowie implements :
public class Duck implements Swimmable, Flyable, Voice {

    public void moveForward() {
        System.out.println(" Quack, I am moving forward...");
    }

    public void TurnRight(){
        System.out.println("I am turning right...");
    }
    public void TurnLeft(){
        System.out.println("I am turning left...");

    }

    public void Stop() {
        System.out.println("Quack. I am relaxing on the surface of the water...");
    }

    public void fly(){
        System.out.println("I am flying!!!");
    }

}
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION