> For the complete documentation index, see [llms.txt](https://programmingfundamental.gitbook.io/programmingwithjava/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://programmingfundamental.gitbook.io/programmingwithjava/obektno-orientirano-programirane-1-chast/laboratorno-uprazhnenie-2/klas.md).

# Клас

**Клас** в ООП наричаме описание на даден клас обекти от заобикалящия ни свят. Класът представлява шаблон, който описва видо­вете **състояния** и **поведението** на конкретните обекти, които биват създа­вани от този клас. Класовете често представят обширни категории, които споделят общи характеристики.

Класът в ООП дефинира **нов тип данни**.Те дефинират какви атрибути ще имат инстанциите от този тип, но не и стойностите на тези атрибути за определен обект. Класовете могат да съдържат също функции, които се наричат методи и са достъпни само за обекти от този тип. Тези методи се дефинират в класа и извършват действие.

Декларацията на клас включва.

1. **Декларация на класа (class)** - започва с запазената дума class.
2. **Идентификатор на класа -** Името трябва да започне с главнa букви, когато са повече от една дума те се записват слято.
3. **Тяло** - по подобие на методите, класовете също имат част, която следва декларацията им, оградена с фигурни скоби – "**{**" и "**}**" между които се намира съдържанието на класа.

```
class Dog {
    // Тяло на класа
}
```

#### Свойства (атрибути)

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

```
class Dog {
    // Полета на класа
    String name;
    String breed;
    int age;
    String color;
}
```

#### Конструктор

Конструкторите се използват за инициализиране на нови обекти.&#x20;

**Представлява специален вид** метод, с който се инициализират нови обекти от този клас. Конструктора се извиква, когато се създава нов обект от този клас.

#### Изисквания към конструктора:

* Името му  да съвпада с името на класа;
* Няма тип на връщания резултат;
* Може да приема аргументи, може и да не приема.

Видове конструктори:

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

```
class Dog {
    // Полета на класа
    String name;
    String breed;
    int age;
    String color;
 
    // Конструктор за деклариране на клас
    public Dog() {
        this.name = "Брзименно";
        this.breed = "куче";
        this.age = 0;
        this.color = "черно";
    }
}
```

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

```
class Dog {
    // Полета на класа
    String name;
    String breed;
    int age;
    String color;
 
    // Конструктор за деклариране на клас
    public Dog(String name, String breed, int age, String color) {
        this.name = name;
        this.breed = breed;
        this.age = age;
        this.color = color;
    }
}
```

Ако изрично не напишем конструктор Java си създава по подразбиране конструктор за всеки клас – той е без параметри(default constructor). **Ако създадем какъвто и да е друг конструктор, то този по подразбиране вече не съществува!**

#### Поведение (Методи)

Методите дефинират поведението на класа и неговите обекти

* Методи за достъп - служат за достъп до полетата на класа
* метод за четене – getter:  Този метод връща стойността на конкретния атрибут

```
class Dog {
    // Полета на класа
    String name;
    String breed;
    int age;
    String color;
 
    // Конструктор за деклариране на клас
    public Dog(String name, String breed, int age, String color) {
        this.name = name;
        this.breed = breed;
        this.age = age;
        this.color = color;
    }
 
    // метод за извличане стойноста на променливата name
    public String getName() {
        return name;
    }
 
    // метод за извличане стойноста на променливата breed
    public String getBreed(){
        return breed;
    }
 
    // метод за извличане стойноста на променливата age
    public int getAge() {
        return age;
    }
 
    // метод за извличане стойноста на променливата color
    public String getColor() {
        return color;
    }
}
```

* метод за запис – setter: променя стойността на даден атрибут чрез параметър.

```
class Dog {
    // Полета на класа
    String name;
    String breed;
    int age;
    String color;
 
    // Конструктор за деклариране на клас
    public Dog(String name, String breed, int age, String color) {
        this.name = name;
        this.breed = breed;
        this.age = age;
        this.color = color;
    }
 
    // метод за присвояване на стойност на променливата name
    public void setName(String name) {
        this.name = name;
    }
 
    // метод за присвояване на стойност на променливата breed
    public void setBreed(String breed) {
       this.breed = breed;
    }
 
    // метод за присвояване на стойност на променливата age
    public void setAge(int age) {
        this.age = age;
    }
 
    // метод за присвояване на стойност на променливата color
    public void setColor(String color) {
        this.color = color;
    }
}
```

**Метода toString()**

Ако искаме да представим, обект като текст използваме метода toString(), той връща текстова интерпретация на обекта. Чрез пренаписване на метода toString() получаваме исканата имплементация.

```
public String toString() {
 return ("Моето име е "+ this.getName()+
        ".\nМоята порода, години и цвят са " +
        this.getBreed()+"," + this.getAge()+
        ","+ this.getColor());
}
```

* equals - метода е стандартен метод в Java и обектно-ориентираната парадигма. Той служи за сравняване стойностите на обектите от дефиницията на класа

```
public boolean equals(Object o) {
    if (this == o) return true;
    Dog dog = (Dog) o;
    return breed.equals(dog.breed);
}
```

#### &#x20;
