Salt la conținutul principal
Modulul 4 · Lecția 1 din 27/14 în curs~15 min
Lecții din modul (1/2)

Interfețe

În timp ce clasele abstracte pot conține atât cod parțial implementat, cât și câmpuri de instanță, interfețele în Java sunt contracte de pur comportament. O interfață definește ce trebuie să poată face o clasă, dar nu cum o face.

Acest lucru permite decuplarea completă între definirea operațiunilor și implementarea lor efectivă.

Definirea unei interfețe (interface)

Folosim cuvântul cheie interface. Toate metodele declarate într-o interfață sunt implicit public și abstract (nu este nevoie să o specificați):

Java
interface Drivable {
    void startEngine();
    void stopEngine();
}

Implementarea unei interfețe (implements)

O clasă implementează o interfață folosind cuvântul cheie implements și este necesară pentru a furniza implementarea (cu un corp) pentru toate metodele definite:

Java
class Motorcycle implements Drivable {
    @Override
    public void startEngine() {
        System.out.println("Rombo del motore acceso!");
    }

    @Override
    public void stopEngine() {
        System.out.println("Motore spento.");
    }
}

Avantajele interfețelor

  1. Moștenire multiplă: În Java, o clasă poate extinde _doar o clasă părinte (moștenire unică), dar poate implementa interfețe multiple în același timp. COD_PROTECTED_GARD_2
  2. Decuplare: Puteți defini variabile folosind tipul de interfață. Orice obiect care implementează acea interfață poate fi atribuit unei astfel de variabile.
    Java
    Drivable vehicle = new Motorcycle();
    vehicle.startEngine();

Constante în interfețe

În interfețe, este posibil să se declare câmpuri. Aceste câmpuri sunt implicit public static final (adică constante de clasă), chiar dacă nu specificați acești modificatori. În consecință, acestea trebuie inițializate imediat după declarare:

Java
interface PhysicsConstants {
    double GRAVITY = 9.81; // Implicitly public static final
}

Metode implicite (default)

Pornind de la Java 8, este posibil să se definească metode cu o implementare implicită în interiorul unei interfețe folosind cuvântul cheie default. Aceste metode nu forțează clasele de implementare să le suprascrie, oferind un comportament de rezervă:

Java
interface Logger {
    void log(String message);

    // Default method with a body
    default void logError(String message) {
        log("ERROR: " + message);
    }
}

Încercați-l singur

Exercițiu#java.m4.l1.e1
Încercări: 0Se încarcă…

Creați o interfață Flyable cu o metodă void fly(). Apoi implementați o clasă Bird care implementează Flyable și imprimă Flying pe ecran.

Se încarcă editorul...
Afișează indiciu

În Flyable, scrieți `void fly();`. În clasa Bird, implementați metoda marcând-o cu `@Override public void fly() { System.out.println('Flying'); }`.

Soluție disponibilă după 3 încercări

Exercițiu#java.m4.l1.e2
Încercări: 0Se încarcă…

Definiți o interfață Drawable cu o metodă void draw(). Apoi implementați o clasă Rectangle care implementează Drawable și imprimă Drawing Rectangle.

Se încarcă editorul...
Afișează indiciu

Definiți `void draw();` în interfață. În Rectangle, utilizați `@Override public void draw() { System.out.println('Drawing Rectangle'); }`.

Soluție disponibilă după 3 încercări

Exercițiu#java.m4.l1.e3
Încercări: 0Se încarcă…

Completați interfața Swimmable definind metoda void swim(). Apoi, completați clasa Duck, astfel încât să implementeze atât Flyable, cât și Swimmable, imprimând metoda Flying in the fly() și Swimming in the swim() .

Se încarcă editorul...
Afișează indiciu

Declarați „void swim();” în Swimmable. Declarați `clasa Duck implementează Flyable, Swimmable` și implementați ambele metode imprimând șirurile solicitate.

Soluție disponibilă după 3 încercări