Java - Abstraktne klase i abstraktne metode


Java abstraktne klase

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

abstract class Animal {
   // Atributi i metode
}

Ako pokušamo stvoriti objekte abstraktne klase, dobićemo grešku u kompajliranju. Pogledajmo primjer:

Animal a1 = new Animal()

Ovaj primjer će generisati sljedeću grešku:

 Animal is abstract; cannot be instantiated

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



Java abstraktna metoda

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

abstract void makeSound();

Ovdje je makeSound() abstraktna metoda. Tijelo metode makeSound() zamjenjuje se s ;. Važno je napomenuti da samo abstraktna klasa može da sadrži abstraktne metode. Ako uvrstimo abstraktne metode u klasu koja nije abstraktna, dobićemo grešku. Abstraktna klasa može da sadrži i abstraktne i neabstraktne metode. Pogledajmo primjer:

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

   abstract void makeSound();
}

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



Nasljeđivanje abstraktnih klasa

Abstraktna klasa se ne može instancirati. Da bismo pristupili članovima abstraktne klase, moramo je nasljediti. Pogledajmo primjer:


Primjer 1: Nasljeđivanje abstraktne 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 abstraktnu klasu Animal. Ne možemo stvoriti predmete od klase Animal. Da bismo pristupili displayInfo(), nasljedili smo podklasu Dog. Zatim smo koristili d1 objekta 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 abstraktnu metodu makeSound() i neabstraktnu 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. Pogledajmo 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 ključnu riječ - supe 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 će nam pomoći 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().