CodeGym/Java Blog/무작위의/기본 클래스 생성자
John Squirrels
레벨 41
San Francisco

기본 클래스 생성자

무작위의 그룹에 게시되었습니다
회원
안녕! 지난 시간에 우리는 생성자에 대해 이야기했고 그들에 대해 많은 것을 배웠습니다. 이제 기본 클래스 생성자 에 대해 이야기하겠습니다 .
기본 클래스 생성자 - 1
기본 클래스 는 무엇입니까 ? 이는 Java에서 여러 다른 클래스가 공통 기원을 가질 수 있다는 사실과 관련이 있습니다.
기본 클래스 생성자 - 2
이것을 상속 이라고 합니다 . 여러 자식 클래스는 하나의 공통 조상을 가질 수 있습니다. 예를 들어 다음과 같은 클래스가 있다고 가정해 보겠습니다 Animal.
public class Animal {

   String name;
   int age;
}
2개의 자식 클래스를 선언할 수 있습니다: CatDog. 이것은 extends 키워드를 사용하여 수행됩니다 .
public class Cat extends Animal {

}

public class Dog extends Animal {

}
앞으로 이것이 도움이 될 수 있습니다. Cat 예를 들어 쥐를 잡는 작업이 있으면 프로그램에 개체를 만듭니다 . 작업이 막대기를 쫓는 것이라면 객체를 사용합니다 Dog . 그리고 수의과 진료소를 시뮬레이션하는 프로그램을 만들면 클래스와 함께 작동할 것입니다 Animal (따라서 고양이와 개를 모두 치료할 수 있음). 객체가 생성될 때 기본 클래스의 생성자가 먼저 호출된다는 점을 기억하는 것이 매우 중요합니다 . 해당 생성자가 완료된 후에만 프로그램은 생성 중인 개체에 해당하는 클래스의 생성자를 실행합니다. 즉, Cat객체를 생성할 때 생성자 Animal가 먼저 실행되고 나중에 생성자가 실행됩니다.Cat생성자가 실행되었습니다 . 이를 보려면 일부 콘솔 출력을 CatAnimal생성자에 추가하십시오.
public class Animal {

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


public class Cat extends Animal {

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

   public static void main(String[] args) {
       Cat cat = new Cat();
   }
}
콘솔 출력: 동물 생성자 실행 고양이 생성자 실행! 실제로 그렇게 작동합니다! 왜? 한 가지 이유는 두 클래스 간에 공유되는 필드가 중복되지 않도록 하는 것입니다. 예를 들어, 모든 동물에는 심장과 뇌가 있지만 모든 동물에 꼬리가 있는 것은 아닙니다. 모든 동물에게 공통적인 심장 영역을 부모 클래스에 선언 Animal하고, 꼬리 영역을 하위 클래스에 선언할 수 있습니다 Cat. . 이제 우리는 Cat3개 필드 모두에 대한 인수를 취하는 클래스 생성자를 선언할 것입니다.
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");
   }
}
참고: 생성자는 클래스에 brain 및 heart 필드가 없더라도 올바르게 작동 Cat합니다 . 이러한 필드는 기본 클래스에서 "상속"됩니다 Animal. 상속 클래스는 기본 클래스의 필드에 액세스할 수 있으므로 클래스에서 볼 수 있습니다 Cat. 결과적으로 클래스에서 이러한 필드를 복제할 필요가 없습니다 Cat. 수업 에서 가져갈 수 있습니다 Animal. 또한 하위 클래스 생성자에서 기본 클래스 생성자를 명시적으로 호출할 수 있습니다. 기본 클래스는 " 슈퍼클래스 "라고도 합니다. 그렇기 때문에 Java는 기본 클래스를 나타내기 위해 키워드 super를 사용합니다. 이전 예에서
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");
   }
}
컴파일러는 자식 클래스의 객체가 생성될 때 기본 클래스 생성자가 먼저 호출된다는 것을 알고 있습니다. 이 동작을 수동으로 변경하려고 하면 컴파일러에서 허용하지 않습니다.

객체가 생성되는 방식

우리는 이전에 기본 클래스와 부모 클래스가 있는 예제를 살펴보았습니다: Animaland Cat. 이 두 클래스를 예로 들어 개체를 만들고 변수를 초기화하는 과정을 살펴보겠습니다. 우리는 정적인스턴스(비정적) 변수가 있다는 것을 알고 있습니다 . Animal기본 클래스에는 변수가 있고 Cat자식 클래스에는 자체 변수가 있다는 것도 알고 있습니다 . Animal명확성을 위해 및 클래스 에 각각 하나의 정적 변수를 추가합니다 Cat. 클래스 의 animalCount 변수는 지구상 Animal 총 동물 종 수를 나타내고 catCount는변수는 고양이 종의 수를 나타냅니다. 또한 두 클래스의 모든 비정적 변수에 시작 값을 할당합니다(그런 다음 생성자에서 변경됨).
public class Animal {

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

   public static int animalCount = 7700000;

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

       this.brain = brain;
       this.heart = heart;
       System.out.println("Animal base class constructor is done!");
       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 = "Initial value of tail in the Cat class";

   static int catCount = 37;

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

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Cat그래서 우리 는 Animal. 어떤 일이 어떤 순서로 일어나는지 확인할 수 있도록 자세한 콘솔 출력을 추가했습니다. Cat객체가 생성 되면 다음과 같이 표시됩니다 .Animal 기본 클래스 생성자가 실행 중입니다. Animal 클래스의 변수가 이미 초기화되었습니까? 정적 변수 animalCount의 현재 값 = 7700000 Animal 클래스의 뇌의 현재 값 = Animal 클래스의 뇌의 초기 값 Animal 클래스의 심장의 현재 값 = Animal 클래스의 심장의 초기 값 이미 Cat 클래스의 변수를 가지고 있음 초기화 되었습니까? 정적 변수 catCount의 현재 값 = 37 Animal 기본 클래스 생성자가 완료되었습니다! brain의 현재 값 = Brain 현재 값 heart = Heart cat 클래스 생성자가 시작됨(Animal 생성자는 이미 완료됨) 정적 변수 catCount의 현재 값 = 37 tail의 현재 값 = Cat 클래스의 tail의 초기 값 tail의 현재 값 = 꼬리 이제 새 객체가 생성될 때 변수 초기화 및 생성자 호출 순서를 명확하게 볼 수 있습니다.
  1. 기본 클래스 ( ) 의 정적Animal 변수가 초기화됩니다. 우리의 경우 Animal클래스의 변수 animalCount는 7700000으로 설정됩니다.

  2. 자식 클래스 ( ) 의 정적Cat 변수가 초기화됩니다.

    참고: 우리는 여전히 Animal생성자 안에 있으며 이미 다음을 표시했습니다.

    Animal 기본 클래스 생성자가 실행 중입니다.
    Animal 클래스의 변수가 이미 초기화되었습니까?
    정적 변수 animalCount의 현재 값 = 7700000
    Animal 클래스의 뇌의 현재 값 = Animal 클래스의 뇌의 초기 값
    Animal 클래스의 심장의 현재 값 = Animal 클래스의 심장의 초기 값
    이미 Cat 클래스의 변수를 가지고 있음 초기화 되었습니까?
    정적 변수 catCount의 현재 값 = 37


  3. 그런 다음 기본 클래스비정적 변수가 초기화됩니다. 특별히 초기 값을 할당한 다음 생성자에서 대체합니다. Animal 생성자는 아직 완료되지 않았지만 brain과 heart의 초기 값은 이미 할당되었습니다.

    Animal 기본 클래스 생성자가 실행 중입니다.
    Animal 클래스의 변수가 이미 초기화되었습니까?
    정적 변수 animalCount의 현재 값 = 7700000
    Animal 클래스의 뇌 현재 값 = Animal 클래스의 뇌 초기 값
    Animal 클래스의 심장 현재 값 = Animal 클래스의 심장 초기 값


  4. 기본 클래스 생성자가 시작됩니다.
    우리는 이미 이 단계가 네 번째라고 확신했습니다. 생성자 시작 부분의 처음 세 단계에서 Animal많은 변수에 이미 값이 할당되었습니다.


  5. 하위 클래스 ( ) 의 비정적Cat 필드가 초기화됩니다.
    이는 Cat생성자가 실행을 시작하기 전에 발생합니다.
    실행이 시작되면 tail 변수에 이미 값이 있습니다.

    cat 클래스 생성자가 시작되었습니다. (The Animal 생성자는 이미 완료되었습니다.) 정적 변수 catCount의 현재 값 = 37 tail의 현재 값 = Cat 클래스의 tail의 초기 값


  6. 자식 클래스 의 생성자가 Cat호출됩니다.

    이것이 Java에서 객체를 생성하는 것과 같습니다!

    암기 학습의 열렬한 팬은 아니지만 변수 초기화 및 생성자 호출 순서를 기억하는 것이 가장 좋습니다 .

    이렇게 하면 프로그램의 흐름과 특정 순간의 개체 상태에 대한 이해가 크게 향상됩니다.

    또한 많은 클래스는 상속을 사용하지 않습니다. 이 경우 기본 클래스와 관련된 단계가 적용되지 않습니다.

코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다