JavaRush /Java Blog /Random-KO /기본 클래스 생성자

기본 클래스 생성자

Random-KO 그룹에 게시되었습니다
안녕하세요! 지난번에 우리는 생성자 에 대해 이야기했고 , 그들에 대해 많은 것을 배웠습니다. 이제 기본 클래스 생성자와 같은 것에 대해 이야기하겠습니다. 기본 클래스 란 무엇입니까 ? 사실 Java에서는 여러 다른 클래스가 공통의 출처를 가질 수 있습니다. 기본 클래스 생성자 - 2이것을 상속 이라고 합니다 . 여러 하위 클래스는 하나의 공통 조상 클래스를 가질 수 있습니다. Animal예를 들어, (동물) 클래스가 있다고 가정해 보겠습니다 .
public class Animal {

   String name;
   int age;
}
Cat예를 들어 2개의 하위 클래스 - 및 를 만들 수 있습니다 Dog. 이는 키워드를 사용하여 수행됩니다 extends.
public class Cat extends Animal {

}

public class Dog extends Animal {

}
이는 앞으로 우리에게 유용할 수 있습니다. 예를 들어, 작업이 쥐를 잡는 것이라면 프로그램에서 객체를 생성할 것입니다 Cat. 작업이 막대 이후에 실행되는 것이라면 객체를 사용합니다 Dog. Animal그리고 동물병원을 시뮬레이션하는 프로그램을 만든다면 (고양이와 개를 모두 치료할 수 있도록) 수업에 도움이 될 것입니다 . 객체를 생성할 때 기본 클래스의 생성자가 먼저 호출되고 그런 다음 우리가 생성 중인 객체인 클래스 자체의 생성자가 호출된다는 점을 미래에 기억하는 것이 매우 중요합니다 . 즉, 객체를 생성할 때 Cat클래스 생성자가 먼저 작동 Animal한 다음 생성자만 작동합니다 Cat. 이를 확인하기 위해 생성자에 추가 Cat하고 Animal콘솔에 출력해 보겠습니다.
public class Animal {

   public Animal() {
       System.out.println("Animal constructor completed");
   }
}


public class Cat extends Animal {

   public Cat() {
       System.out.println("The constructor Cat worked!");
   }

   public static void main(String[] args) {
       Cat cat = new Cat();
   }
}
콘솔 출력:

Отработал конструктор Animal
Отработал конструктор Cat!
실제로 이것이 모든 것이 작동하는 방식입니다! 그것은 무엇을 위한 것입니까? 예를 들어 두 클래스의 공통 필드가 중복되는 것을 방지합니다. 예를 들어 모든 동물에는 심장과 뇌가 있지만 모든 동물에 꼬리가 있는 것은 아닙니다. 상위 클래스 brain의 모든 동물에 공통된 필드와 하위 클래스의 필드를 선언할 수 있습니다 . 이제 우리는 3개의 필드를 모두 전달하는 클래스의 생성자를 생성할 것입니다 .heartAnimaltailCatCat
public class Cat extends Animal {

   String tail;

   public Cat(String brain, String heart, String tail) {
       this.brain = brain;
       this.heart = heart;
       this.tail = tail;
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
주의하세요:클래스에 필드 및 가 Cat없어도 생성자는 성공적으로 작동합니다 . 이 필드는 기본 클래스에서 "풀업"되었습니다 . 하위 클래스는 기본 클래스의 필드에 액세스할 수 있으므로 해당 필드가 우리 클래스에 표시됩니다. 따라서 클래스에서 이러한 필드를 복제할 필요가 없습니다 . 클래스에서 가져올 수 있습니다 . 게다가, 자손 클래스의 생성자에서 기본 클래스의 생성자를 명시적으로 호출할 수도 있습니다. 기본 클래스는 " superclass "라고도 불리며, 이것이 Java가 키워드를 사용하는 이유입니다 . 이전 예에서 brainheartAnimalCatCatAnimalsuper
public Cat(String brain, String heart, String tail) {
       this.brain = brain;
       this.heart = heart;
       this.tail = tail;
   }
상위 클래스에 있는 각 필드를 별도로 할당했습니다. 사실, 이렇게 할 필요는 없습니다. 상위 클래스의 생성자를 호출하고 필요한 매개변수를 전달하는 것으로 충분합니다.
public class Animal {

   String brain;
   String heart;

   public Animal(String brain, String heart) {
       this.brain = brain;
       this.heart = heart;
   }

public class Cat extends Animal {

   String tail;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       this.tail = tail;
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
생성자에서 Cat생성자를 호출 Animal하고 두 개의 필드를 전달했습니다. tail존재하지 않는 필드 하나만 명시적으로 초기화하면 됩니다 Animal. 객체가 생성될 때 부모 클래스의 생성자가 먼저 호출된다고 말한 것을 기억하십니까? 따라서 super()생성자에서 단어가 항상 먼저 와야 하는 이유입니다! 그렇지 않으면 생성자의 논리가 손상되고 프로그램에서 오류가 발생합니다.
public class Cat extends Animal {

   String tail;

   public Cat(String brain, String heart, String tail) {
       this.tail = tail;
       super(brain, heart);//error!
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
컴파일러는 하위 클래스의 객체를 생성할 때 기본 클래스의 생성자가 먼저 호출된다는 것을 알고 있습니다. 그리고 이 동작을 수동으로 변경하려고 하면 허용되지 않습니다.

객체를 생성하는 과정입니다.

위에서 우리는 기본 클래스와 상위 클래스인 and 가 있는 예를 살펴 Animal보았습니다 Cat. 이제 이 두 클래스를 예로 들어 객체를 생성하고 변수를 초기화하는 과정을 살펴보겠습니다. 우리는 변수가 정적 변수 이고 인스턴스 변수 (비정적)라는 것을 알고 있습니다. 또한 기본 클래스에는 Animal자체 변수가 있고 하위 클래스에는 Cat자체 변수가 있다는 것도 알고 있습니다. Animal명확성을 Cat위해 클래스에 하나의 정적 변수를 추가해 보겠습니다 . animalCount클래스 변수는 Animal지구상의 전체 동물 종 수이고, 변수는 catsCount고양이 종 수입니다. 또한 두 클래스의 모든 비정적 변수에 시작 값을 할당합니다(이후 생성자에서 변경됩니다).
public class Animal {

   String brain = "The initial value of brain in the Animal class";
   String heart = "The initial value of heart in the Animal class";

   public static int animalCount = 7700000;

   public Animal(String brain, String heart) {
       System.out.println("The constructor of the Animal base class is being executed");
       System.out.println("Have the variables of the Animal class already been initialized?");
       System.out.println("The current value of the static variable animalCount = " + animalCount);
       System.out.println("Current value of brain in class Animal = " + this.brain);
       System.out.println("Current value of heart in class Animal = " + this.heart);
       System.out.println("Have the variables of the Cat class already been initialized?");
       System.out.println("The current value of the static variable catsCount = " + Cat.catsCount);

       this.brain = brain;
       this.heart = heart;
       System.out.println("Animal base class constructor completed!");
       System.out.println("Current value of brain = " + this.brain);
       System.out.println("Current value of heart = " + this.heart);
   }
}

public class Cat extends Animal {

   String tail = "The initial value of tail in the Cat class";

   static int catsCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println("The constructor of the Cat class has started (the Animal constructor has already been executed)");
       System.out.println("The current value of the static variable catsCount = " + catsCount);
       System.out.println("Current value tail = " + this.tail);
       this.tail = tail;
       System.out.println("Current value tail = " + this.tail);
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Cat그래서 우리는 에서 상속받은 클래스의 새로운 객체를 만듭니다 Animal. 어떤 일이 어떤 순서로 일어날지 알아보기 위해 자세한 콘솔 출력을 프로그램에 추가해 보겠습니다. 객체 생성 결과 콘솔에 출력되는 내용은 다음과 같습니다 Cat.

Выполняется конструктор базового класса Animal
Были ли уже проинициализированы переменные класса Animal?
Текущее meaning статической переменной animalCount = 7700000
Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
Были ли уже проинициализированы переменные класса Cat?
Текущее meaning статической переменной catsCount = 37
Конструктор базового класса Animal завершил работу!
Текущее meaning brain = Мозг
Текущее meaning heart = Сердце
Конструктор класса Cat начал работу (конструктор Animal уже был выполнен)
Текущее meaning статической переменной catsCount = 37
Текущее meaning tail = Изначальное meaning tail в классе Cat
Текущее meaning tail = Хвост
이제 새 객체를 생성할 때 변수가 초기화되고 생성자가 호출되는 순서를 명확하게 확인할 수 있습니다.
  1. 기본 클래스 ( )의 정적 변수가 초기화됩니다 . 우리의 경우 클래스 변수에는 값 7700000이 할당됩니다.AnimalanimalCountAnimal

  2. 하위 클래스 ( )의 정적 변수가 초기화됩니다 . 주의하세요 - 우리는 여전히 생성자 내부에 있고 콘솔은 이미 다음과 같이 말합니다:CatAnimal

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
        Были ли уже проинициализированы переменные класса Cat?
        Текущее meaning статической переменной catsCount = 37
  3. 다음으로 기본 클래스의 비정적 변수가 초기화됩니다 . 우리는 초기 값을 구체적으로 할당한 다음 생성자에서 새 값으로 변경했습니다. 생성자는 아직 작업을 완료하지 않았지만 초기 값은 이미 할당되었습니다 .Animalbrainheart

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
  4. 기본 클래스 생성자가 작동하기 시작합니다 .

    우리는 이 단계가 네 번째 단계에 불과하다는 것을 이미 살펴보았습니다. 처음 세 지점에서는 생성자가 작업을 시작할 때 Animal많은 변수에 이미 값이 할당되었습니다.

  5. 하위 클래스의 비정적 필드 초기화 ( )Cat

    디자이너가 Cat작업을 시작하기 전에 발생합니다.

    그가 작업을 시작했을 때 변수에는 tail이미 다음과 같은 값이 있었습니다.

    
    Конструктор класса Cat начал работу (конструктор Animal уже был выполнен)
    Текущее meaning статической переменной catsCount = 37
    Текущее meaning tail = Изначальное meaning tail в классе Cat
  6. 자손 클래스의 생성자를 호출합니다. Cat

이것이 Java에서 객체를 생성하는 과정의 모습입니다! 우리는 벼락치기를 별로 좋아하지 않지만 변수를 초기화하고 생성자를 호출하는 순서를 기억하고 나중에 기억하는 것이 더 좋습니다 . 이를 통해 특정 순간에 프로그램 진행 상황과 개체 상태에 대한 이해가 크게 향상됩니다. 더욱이 클래스에는 직접 상위 클래스(슈퍼클래스/기본 클래스)가 없는 경우가 많습니다. 이 경우 기본 클래스와 연결된 항목은 실행되지 않습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION