Sobes.tech
Middle

Când ar trebui să folosiți o interfață și când o clasă abstractă?

sobes.tech AI

Răspuns de la AI

Folosim o clasă abstractă pentru a crea funcționalitate de bază și o stare generală, pe care subclasele o pot moșteni. Este potrivită atunci când există metode comune cu implementare și metode care trebuie suprascrise. Clasa abstractă poate avea câmpuri și constructori.

// Clasă abstractă
abstract class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    abstract void makeSound(); // Metodă abstractă

    void eat() { // Metodă cu implementare
        System.out.println(name + " mănâncă.");
    }
}

Folosim o interfață pentru a defini un contract care descrie un set de metode ce trebuie implementate de clase. Este potrivit pentru atingerea comportamentului multipl (moștenire multiplă de funcționalitate). Interfața nu poate avea stare (câmpuri de instanță, cu excepția constantelor) și nici constructori (înainte de Java 8).

// Interfață
interface Flyable {
    void fly(); // Metodă abstractă
}

Tabel comparativ al diferențelor:

Caracteristică Clasă abstractă Interfață
Tip de membri Câmpuri, metode abstracte și concrete, constructori Constante, metode abstracte (implicit), metode statice și default (din Java 8)
Implementarea metodelor Poate avea metode cu implementare Doar metode abstracte până la Java 8, cu Java 8 - static și default
Stare Poate avea stare (câmpuri) Nu poate avea stare (câmpuri de instanță)
Moștenire Moștenire simplă Implementare multiplă
Utilizare "este un" (is-a) - tip de bază "are" (has-a) - contract de comportament