# Абстрактен клас

Клас, който е деклариран с помощта на ключова дума „абстрактен“, е известен като абстрактен клас. Може да има абстрактни методи (методи без тяло), както и конкретни методи (обикновени методи с тяло). Нормалният клас (не-абстрактен клас) не може да има абстрактни методи.

{% hint style="info" %}
Абстрактен клас не може да бъде инстанциран, което означава, че нямате право да създавате обект от него.
{% endhint %}

Да кажем, че имаме клас Animal, който има метод sound() и подкласовете (вижте наследството) от него като Dog, Lion, Horse, Cat и т.н. Тъй като звукът които издават животните се различават, няма смисъл да се прилага този метод в родителския клас. Това е така, защото всеки дъщерен клас трябва да отмени този метод, за да даде свои собствени подробности за реализацията, като например класът Lion ще каже „Roar“ в този метод, а класът Dog ще каже „Woof“.

Така че, когато знаем, че всички класове наследници на Animal ще трябва да заменят този метод, тогава няма смисъл да прилагаме този метод в родителския клас. По този причина, правенето на този метод абстрактен би било по-добрият избор, тъй като като направим този метод абстрактен, ние принуждаваме всички подкласове да имплементират този метод (в противен случай се получава грешка при компилация), също така не е необходимо да създаваме реализация на този метод в родителския клас .

Тъй като класът Animal ще има абстрактен метод, то той трябва да декларира като абстрактен калас.

Когато метода sound() е абстрактен, е задължително за наследниците на Animal класa да дадат подробности за прилагането на този метод. По този начин гарантираме, че всяко животно има звук.

```
//абстрактен клас
abstract class Animal{
   //абстрактен метод
   public abstract void sound();
}
//Наследник наследяващ класа Annimal
public class Dog extends Animal{

   public void sound(){
	System.out.println("Woof");
   }
}

public class Main {
   public static void main(String args[]){
	Animal obj = new Dog();
	obj.sound();
   }
}
```

### Декларация на Абстрактна клас

Абстрактен клас дефинира методите, но не е задължително да имплементира всички методи.

```
//Деклариране на клас с ключовата дума abstract 
abstract class A{
   //Абстрактен метод без тяло
   abstract void myMethod();

   //Конкретен метод с тяло
   void anotherMethod(){
      //реализация
   }
}
```

### Правила&#x20;

*   **Забележка 1:**&#x20;

    Има случаи, когато е трудно или често ненужно да се реализират всички методи в родителския клас. В тези случаи може да се декларираа родителския клас като абстрактен, което го прави специален клас, който не е напълно имплементиран.

    Клас, наследник на абстрактния клас, трябва да имплементира всички методи, които са декларирани като абстрактни в родителския клас.
*   **Забележка 2:**&#x20;

    Абстрактният клас не може да бъде инстанциран, което означава, че не можете да се създават неговия обект. За да се използва този клас, трябва да се създаде друг клас, който разширява този клас и осигурява реализацията на абстрактни методи, след което може да се използва обекта на този дъщерен клас, за да извикате неабстрактни методи на родителския клас, както и внедрените методи (тези които бяха абстрактни в родителски, но имплементирани в класа наследник).
*   **Забележка 3:**&#x20;

    Ако едно дете не имплементира всички абстрактни методи на абстрактния родителски клас, тогава класа наследник също трябва да бъде деклариран за абстрактен.

{% hint style="info" %}
Тъй като тези класове са непълни, защото те имат абстрактни методи, които нямат тяло, така че ако е позволено да се създадат обекти от тези класове, тогава ако някой извика абстрактния метод, използвайки такъв обект, Няма да има действителна реализация на метода.&#x20;
{% endhint %}

### Разлика между Абстрактен клас и конкретен клас&#x20;

Клас, който не е абстрактен, се нарича конкретен клас. В горния пример, Animal е абстрактен клас, а Cat, Dog & Lion са конкретни класове.

Ключови точки:

* Абстрактен клас не може да се ползва, докато не е разширен от друг клас.&#x20;
* Ако декларирате абстрактен метод в клас, тогава трябва да декларирате и класа абстрактен. не можете да имате абстрактен метод в конкретен клас. Обратното не винаги е вярно: ако класът няма абстрактен метод, той също може да бъде маркиран като абстрактен.&#x20;
* Може да има и неабстрактен метод (конкретен).&#x20;
