Java - Apstraktne klase i apstraktne metode


Java apstraktne klase

Apstraktna klasa je klasa koja se ne može instancirati (ne možemo stvoriti objekte apstraktne klase). U Javi koristimo ključnu riječ abstract za deklaraciju apstraktne klase.

abstract class Animal {
   // atributi i metode
}

Ako pokušamo stvoriti objekte apstraktne klase, dobićemo grešku u kompilaciji. Na primjer:

Animal a1 = new Animal()

To će generisati grešku kompilacije:

 Animal is abstract; cannot be instantiated

Iako se apstraktne klase ne mogu instancirati, iz njih možemo stvoriti podklase. Možemo stvoriti objekte podklasa za pristup članovima apstraktne klase. Prije nego što detaljno naučimo o tome, moramo razumjeti apstraktne metode.



Java apstraktna metoda

Koristimo istu ključnu riječ abstract za stvaranje abstraktnih metoda. Apstraktna metoda je deklarisana bez implementacije. Na primjer:

abstract void makeSound();

Ovdje je makeSound() apstraktna metoda. Tijelo makeSound() zamjenjuje se s ;. Važno je napomenuti da samo apstraktna klasa može da sadrži apstraktne metode. Ako uvrstimo apstraktne metode u klasu koja nije apstraktna, dobićemo grešku. Apstraktna klasa može da sadrži i apstraktne i neapstraktne metode. Evo primjera:

abstract class Animal {
   public void displayInfo() {
      System.out.println(“Ja sam životinja.”);
   }

   abstract void makeSound();
}

U gornjem primjeru stvorili smo apstraktnu klasu Animal. Sadrži apstraktnu metodu makeSound() i neabstraktnu metodu displayInfo().



Nasljeđivanje abstraktnih klasa

Apstraktna klasa se ne može instancirati. Da bismo pristupili članovima apstraktne klase, moramo je nasljediti. Na primjer:


Primjer 1: Nasljeđivanje apstraktne klase

abstract class Animal {
 public void displayInfo() {
   System.out.println("Ja sam životinja.");
 }
}

class Dog extends Animal {

}
class Main {
 public static void main(String[] args) {
   Dog d1 = new Dog();
   d1.displayInfo();
 }
}

U gornjem primjeru stvorili smo apstraktnu klasu Animal. Ne možemo stvoriti predmete od klase Animal. Da bismo pristupili displayInfo(), nasljedili smo podklasu Dog. Zatim smo koristili d1 objekt Dog za pristup metodi displayInfo().



Nadjačavanje abstraktnih metoda


U Javi je obavezno nadjačati abstraktne metode superklase u podklasi. To je zato što podklasa nasljeđuje abstraktne metode superklase. Budući da naša podklasa uključuje abstraktne metode, moramo ih nadjačati.


Primjer 2: Nadjačavanje abstraktne metode

abstract class Animal {
   abstract void makeSound();

   public void eat() {
      System.out.println("Ja mogu jesti.");
   }
}

class Dog extends Animal {

   public void makeSound() {
      System.out.println("Ja mogu lajati");
   }
}
class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.makeSound();
      d1.eat();
   }
}

U gornjem primjeru stvorili smo abstraktnu klasu Animal. Klasa sadrži apstraktnu metodu makeSound() i neapstraktnu metodu eat(). Nasljedili smo podklasu Dog od superklase Animal. Ovdje podklasa Dog pruža implementaciju abstraktne metode makeSound(). Zatim smo stvorili objekt d1 od Dog. Koristeći objekt, tada smo pozvali metode d1.makeSound() i d1.eat().



Pristupanje konstruktoru abstraktne klase

Slično neabstraktnim klasama, konstruktoru abstraktne klase pristupamo iz podklase koristeći ključnu riječ super. Na primjer:

abstract class Animal {
   Animal() {
      ….
   }
}

class Dog extends Animal {
   Dog() {
      super();
      ...
   }
}

Ovdje smo koristili ključnu riječ super() unutar konstruktora Dog za pristup konstruktoru Animal. Imajte na umu da ključna riječ super uvijek treba biti prva izjava konstruktora podklase. Pogledajte lekciju Java super ključnu riječ da biste saznali više.



Zašto Java abstrakcija?

Abstrakcija je važan koncept objektno orijentisanog programiranja. Abstrakcija prikazuje samo potrebne informacije, a svi nepotrebni detalji ostaju skriveni. To nam omogućava upravljanje složenošću izostavljanjem ili skrivanjem detalja jednostavnijom idejom višeg nivoa. Praktični primjer abstrakcije mogu biti motorne kočnice. Znamo šta kočnica čini. Kad pritisnemo kočnicu, motocikl će se zaustaviti. Međutim, rad kočnice skriven je od nas.

Glavna prednost skrivanja rada kočnice je u tome što sada proizvođač može različito ugraditi kočnicu za različite motore, međutim, ono što radi kočnica biće isto. Uzmimo primjer koji nam pomaže da bolje razumijemo Java abstrakciju.


Primjer 3: Java abstrakcija

abstract class Animal {
   abstract void makeSound();

}

class Dog extends Animal {
   public void makeSound() {
      System.out.println("Ja mogu lajati.");
   }
}

class Cat extends Animal {
   public void makeSound() {
      System.out.println("Ja mogu mjaukati ");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.makeSound();

      Cat c1 = new Cat();
      c1.makeSound();
   }
}

U gornjem primjeru stvorili smo superklasu Animal. Superklasa Animal ima abstraktnu metodu makeSound(). Metoda makeSound() ne može se implementovati unutar Animal. To je zato što svaka životinja ispušta različite zvukove. Dakle, sve podklase Animal imale bi različitu implementaciju makeSound().

Ne možemo implementovati makeSound() u Animal na takav način da može biti tačan za sve podklase Animal. Dakle, implementacija makeSound() u Animal ostaje skrivena. U gornjem primjeru, Dog izrađuje vlastitu implementaciju makeSound(), a Cat izrađuje vlastitu implementaciju makeSound().