Абстрацт Цласс Вс. Интерфејс у ​​Јави: Објашњење са примерима

U programiranju orijentisanom ka objektima, apstraktne klase i interfejsi služe za postizanje apstrakcije. Apstrakcija podrazumeva skrivanje detalja implementacije od krajnjih korisnika, omogućavajući im da se fokusiraju na funkcionalnost bez ulaska u kompleksnost pozadine.

Kada govorimo o apstrakciji, važno je znati šta neka funkcionalnost radi, ali ne nužno i kako se ona sprovodi.

Hajde da detaljnije istražimo svaki od ovih koncepata i shvatimo njihovu svrhu i primenu.

Apstraktna Klasa

U Javi, apstraktna klasa je ona koja ne može direktno kreirati objekte (instance). Ova klasa može, ali i ne mora, sadržati apstraktne metode. Apstraktna metoda je ona koja je definisana bez konkretne implementacije, odnosno nema telo kada je deklarisana.

Pogledajmo primer apstraktne klase GraphicObject (prema Oracle-u).

Da biste kreirali apstraktnu klasu, potrebno je upotrebiti ključnu reč abstract pre definicije same klase.

abstract class abstractClass {
    void run() {
        System.out.println("ran");
    }
}

Apstraktna klasa se može koristiti kao osnova za druge klase, što znači da se može proširivati (nasleđivati).

abstract class AbstractClass {
    void run() {
        System.out.println("ran");
    }
}

class ExtendingAbstractClass extends AbstractClass {
    void newMethod() {
        System.out.println("new");
    }

    @Override
    void run() {
        System.out.println("override");
    }
}

Apstraktne klase su korisne kada želimo da implementiramo zajedničke metode za više klasa koje nasleđuju datu apstraktnu klasu. Takođe, mogućnost definisanja apstraktnih metoda je izuzetno korisna za klase koje imaju slične metode, ali sa različitim načinima implementacije. Posmatrajmo jedan primer.

Zamislite automobil. Sve automobile karakterišu određene funkcionalnosti kao što su pokretanje, zaustavljanje, vožnja unazad itd. Ove funkcionalnosti su zajedničke svim vrstama automobila.

Ali, šta je sa naprednijim funkcijama kao što je autonomna vožnja? Način na koji se ova funkcionalnost implementira može se razlikovati u zavisnosti od tipa automobila. Pogledajmo kako se ovaj koncept može primeniti u objektno orijentisanom programiranju.

Prvo, kreiramo apstraktnu klasu Car koja će biti osnova za različite tipove automobila:

abstract class Car {
    void start() {
        // implementation
        System.out.println("runs car");
    }

    void stop() {
        // implementation
        System.out.println("engine stops");
    }

    void reverse() {
        // implementation
        System.out.println("reverse mode enabled");
    }

    abstract void selfDrive();
}

Metode start(), stop() i reverse() su uobičajene za sve automobile. Njihova implementacija je definisana u samoj klasi Car. Međutim, implementacija režima autonomne vožnje (selfDrive()) može se razlikovati u zavisnosti od tipa automobila. Stoga, selfDrive() definišemo kao apstraktnu metodu, koju će svaka potklasa implementirati na svoj način.

class CarTypeA extends Car {
    @Override
    void start() {
        super.start();
    }

    @Override
    void stop() {
        super.stop();
    }

    @Override
    void reverse() {
        super.reverse();
    }

    void selfDrive() {
        // custom implementation
        System.out.println("Type A self driving mode enabled");
    }
}
class CarTypeB extends Car {
    // ...all similar methods

    void selfDrive() {
        // custom implementation
        // different implementation than CarTypeB
        System.out.println("Type B self driving mode enabled");
    }
}

Važno je napomenuti da ako potklasa ne implementira sve apstraktne metode definisane u apstraktnoj klasi, i sama mora biti deklarisana kao apstraktna klasa.

Interfejs

Interfejs predstavlja način da se klasama definiše koje metode moraju implementirati. Na primer, ako se vratimo na primer sa automobilima, oni imaju osnovne funkcije: pokretanje, kretanje i zaustavljanje. Ove funkcije su univerzalne za sve automobile.

Ako klasa implementira interfejs automobila, ona mora implementirati sve te metode kako bi se osiguralo da automobil funkcioniše pravilno i sigurno.

Slično apstraktnim klasama, ne može se kreirati objekat ili instanca interfejsa. Interfejs se može smatrati potpuno apstraktnom klasom, jer sadrži samo apstraktne metode, odnosno metode bez konkretne implementacije.

Interfejs se kreira pomoću ključne reči interface.

interface CAR {
    void start();
    void stop();
    void move();
}

Klasa implementira interfejs koristeći ključnu reč implements prilikom definisanja klase.

class CarTypeB implements CAR {
    public void start() {
        System.out.println("started");
    }

    public void stop() {
        System.out.println("stopped");
    }

    public void move() {
        System.out.println("running");
    }
}

Sličnosti

Pored toga što se ne mogu instancirati, apstraktne klase i interfejsi imaju i druge zajedničke karakteristike.

Razlike

Apstraktna klasa Interfejs
Nasleđivanje & Implementacija Klasa može da nasledi samo jednu apstraktnu klasu. Klasa može da implementira više interfejsa.
Tipovi varijabli Može sadržati finalne, ne-finalne, statičke i ne-statičke varijable. Može sadržati samo statičke i finalne varijable.
Tipovi metoda Može sadržati apstraktne i ne-apstraktne metode. Može sadržati samo apstraktne metode, uz izuzetak statičkih metoda.
Modifikatori pristupa Apstraktna klasa može imati modifikatore pristupa. Potpisi metoda u interfejsu su podrazumevano javni. Interfejs nema modifikator pristupa.
Konstruktori i destruktori Može deklarisati konstruktore i destruktore. Ne može deklarisati konstruktore ili destruktore.
Brzina Brže. Sporije.

Razlike između apstraktne klase i interfejsa

Kada koristiti apstraktnu klasu a kada interfejs?

Koristite apstraktne klase kada:

  • Želite da delite neke zajedničke metode i polja među više klasa.
  • Potrebno je deklarisati ne-statička i ne-finalna polja koja menjaju stanje objekata.

Interfejse koristite kada:

  • Želite da definišete ponašanje klase koja implementira interfejs, bez ulaženja u detalje implementacije.
  • Želite da osigurate da klasa implementira sve neophodne metode da bi ispravno funkcionisala.

Završne reči

Interfejsi se najčešće koriste za kreiranje API-ja (Application Programming Interface), jer omogućavaju definisanje strukture funkcionalnosti bez specificiranja načina na koji se ta funkcionalnost implementira.

Apstraktne klase su korisne za deljenje zajedničkih apstraktnih i ne-apstraktnih metoda među klasama koje nasleđuju tu apstraktnu klasu, čime se kod čini više upotrebljivim i organizovanim.

Za dalje usavršavanje u Javi, istražite online kurseve iz ove oblasti. Ako se pripremate za intervju za posao u Javi, razmislite o vežbanju odgovora na pitanja iz oblasti objektno orijentisanog programiranja.