# Клас

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

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

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

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;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://programmingfundamental.gitbook.io/programmingwithjava/obektno-orientirano-programirane-1-chast/laboratorno-uprazhnenie-2/klas.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
