JavaRush /Java Blog /Random-TL /Base class constructors

Base class constructors

Nai-publish sa grupo
Kamusta! Noong huling beses na napag-usapan namin ang tungkol sa mga konstruktor , at marami kaming natutunan tungkol sa kanila. Ngayon ay pag-uusapan natin ang tungkol sa isang bagay tulad ng mga base class constructor. Ano ang base class ? Ang katotohanan ay sa Java, maraming iba't ibang klase ang maaaring magkaroon ng isang karaniwang pinagmulan. Base class constructors - 2Ito ay tinatawag na mana . Ang ilang mga descendant class ay maaaring magkaroon ng isang common ancestor class. Halimbawa, isipin na mayroon tayong klase Animal(hayop):
public class Animal {

   String name;
   int age;
}
Maaari kaming lumikha para dito, halimbawa, 2 descendant classes - Catat Dog. Ginagawa ito gamit ang keyword extends.
public class Cat extends Animal {

}

public class Dog extends Animal {

}
Ito ay maaaring maging kapaki-pakinabang sa atin sa hinaharap. Halimbawa, kung ang gawain ay manghuli ng mga daga, gagawa kami ng isang bagay sa programa Cat. Kung ang gawain ay tumakbo pagkatapos ng isang stick, pagkatapos ay ginagamit namin ang object Dog. At kung gagawa tayo ng programa na gayahin ang isang beterinaryo na klinika, gagana ito sa klase Animal(upang magamot ang parehong pusa at aso). Napakahalagang tandaan para sa hinaharap na kapag lumilikha ng isang bagay, ang constructor ng base class nito ay tinatawag na una , at pagkatapos lamang ang constructor ng klase mismo, ang object na ating nililikha, ay tinatawag. Iyon ay, kapag lumilikha ng isang bagay, Catang tagabuo ng klase ay unang gagana Animal, at pagkatapos lamang ang tagabuo Cat. Upang matiyak ito, idagdag natin sa mga konstruktor Catat Animaloutput sa console.
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();
   }
}
Output ng console:

Отработал конструктор Animal
Отработал конструктор Cat!
Sa katunayan, ito ay kung paano gumagana ang lahat! Para saan ito? Halimbawa, upang maiwasan ang pagdoble ng mga karaniwang field ng dalawang klase. Halimbawa, ang bawat hayop ay may puso at utak, ngunit hindi lahat ng hayop ay may buntot. Maaari naming ideklara ang mga field na karaniwan sa lahat ng hayop brainsa heartparent class Animal, at isang field tailsa subclass Cat. Ngayon ay gagawa kami ng isang constructor para sa class Cat, kung saan ipapasa namin ang lahat ng 3 field.
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");
   }
}
Bigyang-pansin:matagumpay na gumagana ang konstruktor, kahit na ang klase Catay walang mga patlang brainat heart. Ang mga patlang na ito ay "hinila pataas" mula sa batayang klase Animal. Ang descendant class ay may access sa mga field ng base class, kaya Catmakikita ang mga ito sa aming klase. Samakatuwid, hindi natin kailangang Cati-duplicate ang mga field na ito sa klase - maaari nating kunin ang mga ito mula sa klase Animal. Bukod dito, maaari nating tahasang tawagan ang tagabuo ng batayang klase sa tagabuo ng descendant na klase. Ang batayang klase ay tinatawag ding “ superclass ,” kaya naman ginagamit ng Java ang keyword super. Sa nakaraang halimbawa
public Cat(String brain, String heart, String tail) {
       this.brain = brain;
       this.heart = heart;
       this.tail = tail;
   }
Hiwalay naming itinalaga ang bawat field na nasa aming parent class. Sa katunayan, hindi mo kailangang gawin ito. Sapat na tawagan ang tagabuo ng klase ng magulang at ipasa ito sa mga kinakailangang parameter:
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");
   }
}
Sa constructor, Cattinawag namin ang constructor Animalat ipinasa ang dalawang field dito. Kailangan lang nating tahasang magpasimula ng isang field - tailna Animalwala. Tandaan kung paano namin sinabi na kapag ang isang bagay ay nilikha, ang constructor ng parent class ay unang tinatawag? Kaya, ito ang dahilan kung bakit ang salita super()ay dapat palaging mauna sa tagabuo! Kung hindi, ang lohika ng mga konstruktor ay masisira at ang programa ay bubuo ng isang error.
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");
   }
}
Alam ng compiler na kapag lumilikha ng isang object ng isang descendant class, unang tinatawag ang constructor ng base class. At kung susubukan mong manu-manong baguhin ang gawi na ito, hindi ito papayagan.

Ang proseso ng paglikha ng isang bagay.

Sa itaas ay tumingin kami sa isang halimbawa na may base at parent class - Animalat Cat. Ngayon, gamit ang dalawang klase na ito bilang isang halimbawa, titingnan natin ang proseso ng paglikha ng isang bagay at pagsisimula ng mga variable. Alam namin na ang mga variable ay static at instance variable (non-static). Alam din natin na ang base class Animalay may sarili nitong mga variable, at ang descendant class Catay may sarili. Magdagdag tayo ng isang static na variable sa klase para sa Animalkalinawan . CatAng variable animalCountng klase Animalay ang kabuuang bilang ng mga species ng hayop sa mundo, at ang variable catsCountay ang bilang ng mga species ng pusa. Bilang karagdagan, magtatalaga kami ng mga panimulang halaga sa lahat ng mga di-static na variable ng parehong mga klase (na magbabago sa constructor).
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");
   }
}
Kaya, lumikha kami ng isang bagong bagay ng klase Catna minana mula sa Animal. Magdagdag tayo ng detalyadong output ng console sa ating programa upang makita kung ano ang mangyayari at sa anong pagkakasunud-sunod. Ito ang magiging output sa console bilang resulta ng paglikha ng isang bagay 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 = Хвост
Kaya, ngayon ay malinaw nating makikita kung anong mga variable ng pagkakasunud-sunod ang pinasimulan at tinatawag ang mga konstruktor kapag lumilikha ng isang bagong bagay:
  1. Ang mga static na variable ng base class ( ) ay sinisimulan Animal. Sa aming kaso, ang variable animalCountng klase Animalay itinalaga ang halaga na 7700000.

  2. Ang mga static na variable ng descendant class ( ) ay sinisimulan Cat. Bigyang-pansin - nasa loob pa rin kami ng constructor Animal, at ang console ay nagsabi na:

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
        Были ли уже проинициализированы переменные класса Cat?
        Текущее meaning статической переменной catsCount = 37
  3. Susunod, ang mga non-static na variable ng base class ay sinisimulan . Partikular naming itinalaga sa kanila ang mga paunang halaga, na pagkatapos ay binago sa mga bago sa constructor. Ang tagabuo Animalay hindi pa nakumpleto ang gawain nito, ngunit ang mga paunang halaga brainay heartnaitalaga na:

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
  4. Ang base class constructor ay nagsimulang magtrabaho .

    Nakita na natin na ang yugtong ito ay pang-apat lamang: sa unang tatlong punto, sa oras na magsimulang magtrabaho ang tagabuo, Animalmaraming mga variable ang naitalaga na ng mga halaga.

  5. Pagsisimula ng mga non-static na field ng isang child class ( Cat).

    Nangyayari ito bago Catmagsimulang magtrabaho ang taga-disenyo.

    Sa oras na nagsimula siyang magtrabaho, ang variable tailay mayroon nang halaga:

    
    Конструктор класса Cat начал работу (конструктор Animal уже был выполнен)
    Текущее meaning статической переменной catsCount = 37
    Текущее meaning tail = Изначальное meaning tail в классе Cat
  6. Ang constructor ng descendant class ay tinatawag Cat

Ito ang hitsura ng proseso ng paglikha ng isang bagay sa Java! Dapat kong sabihin na hindi kami malaking tagahanga ng cramming, ngunit mas mahusay na kabisaduhin ang pagkakasunud-sunod ng pagsisimula ng mga variable at pagtawag sa mga constructor at pag-alala sa kanila para sa hinaharap . Ito ay lubos na magpapalaki sa iyong pag-unawa sa pag-usad ng programa at sa estado ng iyong mga bagay sa anumang naibigay na sandali. Bukod dito, ang mga klase ay madalas na walang direktang parent classes (superclasses/base classes). Sa kasong ito, ang mga item na nauugnay sa base class ay hindi isasagawa.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION