Клас

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

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

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

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

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

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

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

Конструктор

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

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

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

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

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

  • Конструктор по подразбиране - не приема параметри; инициализира член-променливите със стойности по подразбиране. В един клас може да има само един конструктор по подразбиране.
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;
    }
}

Поведение по подразбиране

Всеки клас в Java наследява няколко метода от класа Object, които могат да се използват или пренапишат, за да определят поведението на обектите:

Метод Описание
toString() Връща текстово представяне на обекта. По подразбиране показва името на класа и хеш кода, но обикновено се пренаписва за по-информативен изход.
equals(Object o) Сравнява два обекта за равенство. По подразбиране проверява дали са еднакви по референция. Препоръчително е да се пренапише, когато искаме сравнение по съдържание.
hashCode() Връща хеш код на обекта. Ако се пренаписва equals(), трябва да се пренаписва и hashCode(), за да се гарантира съвместимост.
clone() Позволява създаване на копие на обекта. clone() е защитен метод в Object и трябва да се имплементира чрез интерфейса Cloneable или чрез собствен метод за копиране.

Пример за пренаписване на toString(), equals() и hashCode()

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Dog)) return false;
        Dog dog = (Dog) o;
        return age == dog.age && name.equals(dog.name) && breed.equals(dog.breed);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, breed, age);
    }
}
  • toString() се използва за по-удобен и четим изход на обекта.

  • equals() и hashCode() гарантират коректно сравнение и работа в колекции като HashMap и HashSet.

  • Методът clone() позволява да се създаде нов обект със същите стойности, без да се променя оригинала.

Enum

Enum (enumeration) е специален вид клас, който дефинира фиксиран набор от константи. Enum е полезен, когато имаме ограничен брой стойности, които не се променят (например дни от седмицата, статуси на поръчка, типове потребители).

Характеристики на Enum:

  • Всяка константа е уникален обект на класа Enum.
  • Enum наследява java.lang.Enum, но не може да наследява друг клас.
  • Може да има полета, конструктори и методи, като конструкторът е по подразбиране private.
  • Enum осигурява сигурност на типа – не могат да се използват произволни стойности извън дефинирания набор.

Структура на Enum:

enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
  • Може да се добавят полета и методи:
enum Day {
MONDAY("Работен ден"),
SUNDAY("Почивен ден");

private String description;

private Day(String description) {
    this.description = description;
}

public String getDescription() {
    return description;
}
}

Вградени методи:

Метод Описание
name() Връща името на константата като String.
ordinal() Връща позицията на константата в enum (започва от 0).
valueOf(String name) Връща константата с даденото име. Ако няма такава, хвърля IllegalArgumentException.
toString() Връща текстовото представяне на константата (по подразбиране съвпада с name(), но може да се пренапише).
equals(Object other) Сравнява дали две константи са еднакви.
hashCode() Връща хеш-код за константата.

####