— Привіт, Аміго! Зараз я розповім тобі про процес створення об'єкта.
— А що там складного? Написав new ім'я класу, вказав правильний конструктор і готово!
— Це так. Але що при цьому відбувається всередині об'єкта?
— А що там відбувається?
— А ось що! Об'єкт створюється у кілька етапів.
1) Спочатку виділяється пам'ять під усі змінні – поля класу.
2) Потім йде ініціалізація базового класу.
3) Після цього усім змінним присвоюються значення, якщо вони вказані.
4) І зрештою, викликається конструктор.
— Виглядає не дуже складно: спочатку змінні, потім конструктор.
— Погляньмо, як це буде працювати на прикладі двох класів:
Код |
Опис |
class Pet
{
int x = 5, y = 5; ←-
int weight = 10; ←-
Pet(int x, int y)
{
this.x = x; ←-
this.y = y; ←-
}
}
class Cat extends Pet
{
int tailLength = 8; ←-
int age;
Cat(int x, int y, int age)
{
super(x, y); ←-
this.age = age; ←-
}
}
|
Ми створили два класи: Pet(домашній улюбленець) та Cat(кіт).
У класі Cat ми бачимо явний виклик конструктора базового класу.
Він завжди має бути в першому рядку конструктора.
Ось що станеться після виділення пам'яті:
18 – виклик конструктора базового класу
3, 4 – ініціалізація змінних у Pet
8, 9 – відпрацює код конструктора Pet
далі розпочнеться процес ініціалізації класу Cat
14 – ініціалізація змінних в Cat
19 – відпрацює код конструктора Cat |
public static void main(String[] args)
{
Cat cat = new Cat (50, 50, 5);
}
|
|
— Щось трохи заплутано. Чому так складно?
— У дійсності не складно, якщо знати, що насправді відбувається:
Якщо клас не має жодного конструктора, він буде створений автоматично.
Конструктор за замовчуванням |
|
class Cat
{
int x = 5;
int y = 5;
}
|
class Cat
{
int x = 5;
int y = 5;
public Cat()
{
}
}
|
Якщо не викликаєш конструктор базового класу, його виклик буде додано автоматично.
Виклик конструктора базового класу |
|
class Pet
{
public String name;
}
|
class Pet extends Object
{
public String name;
public Pet()
{
super();
}
}
|
class Cat extends Pet
{
int x = 5;
int y = 5;
}
|
class Cat extends Pet
{
int x = 5;
int y = 5;
public Cat()
{
super();
}
}
|
Ініціалізація змінних класу відбувається в конструкторі.
Ініціалізація змінних класу |
|
class Cat
{
int x = 5;
int y = 5;
}
|
class Cat
{
int x;
int y;
public Cat()
{
super();
this.x = 5;
this.y = 5;
}
}
|
Як все це відбувається насправді |
|
class Pet
{
int x = 5, y = 5;
int weight = 10;
Pet(int x, int y)
{
this.x = x;
this.y = y;
}
}
class Cat extends Pet
{
int tailLength = 8;
int age;
Cat(int x, int y, int age)
{
super(x, y);
this.age = age;
}
}
|
class Pet extends Object
{
int x;
int y;
int weight;
Pet(int x, int y)
{
//виклик конструктора базового класу
super();
//ініціалізація змінних
this.x = 5;
this.y = 5;
this.weight = 10;
//виклик коду конструктора
this.x = x;
this.y = y;
}
}
class Cat extends Pet
{
int tailLength;
int age;
Cat(int x, int y, int age)
{
//виклик конструктора базового класу
super(x, y);
//ініціалізація змінних
this.tailLength = 8;
//виклик коду конструктора
this.age = age;
}
}
|
— Тепер набагато зрозуміліше: спочатку базовий клас, потім змінні поза конструктором, потім виклик коду конструктора.
— Молодець, саме так!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ