Клас
Клас в ООП наричаме описание на даден клас обекти от заобикалящия ни свят. Класът представлява шаблон, който описва видовете състояния и поведението на конкретните обекти, които биват създавани от този клас. Класовете често представят обширни категории, които споделят общи характеристики.
Класът в ООП дефинира нов тип данни.Те дефинират какви атрибути ще имат инстанциите от този тип, но не и стойностите на тези атрибути за определен обект. Класовете могат да съдържат също функции, които се наричат методи и са достъпни само за обекти от този тип. Тези методи се дефинират в класа и извършват действие.
Декларацията на клас включва:
- Декларация на класа (class) - започва със запазената дума class.
- Идентификатор на класа - Името трябва да започва с главнa букви; когато името е повече от една дума, то те се записват слято.
- Тяло - по подобие на методите, класовете също имат част, която следва декларацията им, оградена с фигурни скоби – “{” и “}”, между които се намира съдържанието на класа.
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() | Връща хеш-код за константата. |
####