"Xin chào, Amigo! Bây giờ tôi sẽ kể cho bạn nghe về cách đồ vật được tạo ra."

"Có gì phức tạp đâu chú Rishi? Chú viết new và tên lớp, chỉ ra hàm tạo chính xác là xong!"

"Đúng vậy. Nhưng điều gì xảy ra bên trong đối tượng khi bạn làm điều đó?"

"Chuyện gì xảy ra?"

"Đây là những gì sẽ xảy ra: Đối tượng được tạo trong một số giai đoạn."

1)  Đầu tiên, bộ nhớ được phân bổ cho tất cả các biến thành viên của lớp.

2)  Sau đó, lớp cơ sở được khởi tạo.

3)  Sau đó, tất cả các biến được gán giá trị, nếu có được chỉ định.

4)  Cuối cùng, hàm tạo được gọi.

"Có vẻ không khó lắm: đầu tiên là các biến, sau đó là hàm tạo."

"Hãy xem cách nó hoạt động trong một ví dụ với hai lớp:"

Mã số Sự miêu tả
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; ←-
 }
}
Khai báo hai lớp: Pet(thú cưng) và Cat(mèo).

Trong lớp Cat, chúng ta thấy một lệnh gọi rõ ràng đến hàm tạo của lớp cơ sở .
Nó phải luôn ở dòng đầu tiên trong hàm tạo.

Đây là những gì xảy ra sau khi bộ nhớ được cấp phát:
18  – gọi hàm tạo của lớp cơ sở.
3, 4  – khởi tạo biến trong Pet.
8, 9  – thực thi mã trong hàm tạo Pet.

Sau đó lớp Cat bắt đầu được khởi tạo.
14  – khởi tạo các biến trong Cat
19  – thực thi mã trong hàm tạo Cat

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

"Điều đó hơi khó hiểu. Tại sao nó lại phức tạp như vậy?"

"Thật ra không khó nếu bạn biết chuyện gì đang thực sự xảy ra:"

Nếu một lớp không có bất kỳ hàm tạo nào, một hàm tạo sẽ được tạo tự động.

Nhà xây dựng mặc định
class Cat
{
 int x = 5;
 int y = 5;
}
class Cat
{
 int x = 5;
 int y = 5;
 public Cat() 
 {
 }
}

Nếu bạn không gọi hàm tạo của lớp cơ sở, nó sẽ được gọi tự động.

Gọi hàm tạo của lớp cơ sở
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();
 }
}

Các biến thành viên được khởi tạo trong hàm tạo.

Khởi tạo các biến thành viên
class Cat
{
 int x = 5;
 int y = 5;
}
class Cat
{
 int x;
 int y;
 public Cat()
 {
  super();
  this.x = 5;
  this.y = 5;
  }
}
Điều gì thực sự xảy ra
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;
 }
}

"Bây giờ nó rõ ràng hơn nhiều: đầu tiên là lớp cơ sở, sau đó là các biến bên ngoài hàm tạo, sau đó là mã hàm tạo."

"Làm tốt lắm, Amigo! Vậy đó!"