"안녕하세요, 아미고! 이제 객체가 어떻게 생성되는지 알려드리겠습니다."

"무슨 일이 그렇게 복잡해요, Rishi 삼촌? 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(pet) 및 Cat(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)
 {
  //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;
 }
}

"이제 훨씬 더 명확해졌습니다. 먼저 기본 클래스, 생성자 외부의 변수, 생성자 코드입니다."

"잘했어, 아미고! 바로 그거야!"