— Привіт, Аміго! Зараз я розповім тобі про процес створення об'єкта.

— А що там складного? Написав 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;
 }
}

— Тепер набагато зрозуміліше: спочатку базовий клас, потім змінні поза конструктором, потім виклик коду конструктора.

— Молодець, саме так!