"Здравей, Амиго! Сега ще ти разкажа How се създават обекти."

"Какво му е толкова сложното, чичо Риши? Пишеш new и името на класа, посочваш правилния конструктор и готово!"

"Това е вярно. Но Howво се случва вътре в обекта, когато направите това?"

"Какво става?"

„Ето Howво се случва: обектът се създава на няколко етапа.“

1)  Първо се разпределя памет за всички членски променливи на класа.

2)  След това базовият клас се инициализира.

3)  След това на всички променливи се присвояват стойности, ако има такива.

4)  Накрая се извиква конструкторът.

„Не изглежда много трудно: първо променливите, след това конструкторът.“

„Нека да видим How работи това в пример с два класа:“

Код Описание
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(pet) и Cat(cat).

В класа Cat виждаме изрично извикване на конструктора на базовия клас .
Винаги трябва да е на първия ред в конструктора.

Ето Howво се случва след заделяне на паметта:
18  – извикване на конструктора на базовия клас.
3, 4  – инициализиране на променливи в Pet.
8, 9  – изпълнете codeа в конструктора Pet.

След това класът Cat започва да се инициализира.
14  – инициализиране на променливи в Cat
19  – изпълнение на codeа в конструктора на Cat

public static void main(String[] args)
{
 Cat cat = new Cat (50, 50, 5);
}

„Това е малко объркващо. Защо е толкова сложно?“

„Всъщност не е трудно, ако знаете Howво наистина се случва:“

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

Конструктор по подразбиране
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)
 {
  //call of the base class's constructor
  super();
  //initialize variables
  this.x = 5;
  this.y = 5;
  this.weight = 10;
  //execute the constructor code
  this.x = x;
  this.y = y;
 }
}
class Cat extends Pet
{
 int tailLength;
 int age;
 Cat(int x, int y, int age)
 {
  //call of the base class's constructor
   super(x, y);
  //initialize variables
  this.tailLength = 8;
  //execute the constructor code
  this.age = age;
 }
}

„Сега е много по-ясно: първо базовият клас, след това променливите извън конструктора, след това codeът на конструктора.“

"Браво, Амиго! Това е!"