Sobes.tech
Middle

Када треба користити интерфејс, а када апстрактну класу?

sobes.tech АИ

Одговор од АИ

Koristimo apstraktnu klasu za kreiranje osnovne funkcionalnosti i opšteg stanja koje mogu naslediti podklase. Pogodna je kada postoje zajedničke metode sa implementacijom i metode koje treba da budu prepisane. Apstraktna klasa može imati polja i konstruktore.

// Apstraktna klasa
abstract class Animal {
    String name;

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

    abstract void makeSound(); // Apstraktna metoda

    void eat() { // Metoda sa implementacijom
        System.out.println(name + " jede.");
    }
}

Koristimo interfejs za definisanje ugovora koji opisuje skup metoda koje klase moraju da implementiraju. Pogodan je za postizanje višestrukog ponašanja (višestruko nasleđivanje funkcionalnosti). Interfejs ne može imati stanje (polja instance, osim konstanti) i konstruktore (pre Java 8).

// Interfejs
interface Flyable {
    void fly(); // Apstraktna metoda
}

Tabela poređenja razlika:

Osobina Apstraktna klasa Interfejs
Tip članova Polja, apstraktne i konkretne metode, konstruktori Konstantne, apstraktne metode (po defaultu), statičke i default metode (od Java 8)
Implementacija metoda Može imati metode sa implementacijom Samo apstraktne metode do Java 8, od Java 8 - static i default
Stanje Može imati stanje (polja) Ne može imati stanje (polja instance)
Nasleđivanje Jednolinijsko nasleđivanje Višestruka implementacija
Upotreba "je-" (is-a) - osnovni tip "ima-" (has-a) - ugovor o ponašanju