JavaRush /Java Blogu /Random-AZ /Əsas sinif konstruktorları

Əsas sinif konstruktorları

Qrupda dərc edilmişdir
Salam! Keçən dəfə biz konstruktorlar haqqında danışdıq və onlar haqqında çox şey öyrəndik. İndi biz əsas sinif konstruktorları kimi bir şey haqqında danışacağıq. Baza sinfi nədir ? Fakt budur ki, Java-da bir neçə fərqli sinif ümumi mənşəyə malik ola bilər. Əsas sinif konstruktorları - 2Buna miras deyilir . Bir neçə nəsil sinfi bir ümumi əcdad sinfinə malik ola bilər. Məsələn, təsəvvür edin ki, bizim sinifimiz Animal(heyvanımız):
public class Animal {

   String name;
   int age;
}
Bunun üçün, məsələn, 2 nəsil sinfi yarada bilərik - CatDog. Bu açar sözdən istifadə etməklə edilir extends.
public class Cat extends Animal {

}

public class Dog extends Animal {

}
Bu, gələcəkdə bizim üçün faydalı ola bilər. Məsələn, tapşırıq siçanları tutmaqdırsa, proqramda bir obyekt yaradacağıq Cat. Əgər tapşırıq bir çubuq arxasınca qaçmaqdırsa, o zaman obyektdən istifadə edirik Dog. Və əgər biz baytarlıq klinikasını simulyasiya edən bir proqram yaratsaq, o, siniflə işləyəcək Animal(həm pişikləri, həm də itləri müalicə edə bilmək üçün). Gələcək üçün xatırlamaq çox vacibdir ki , obyekt yaradarkən onun əsas sinifinin konstruktoru əvvəlcə adlanır və yalnız bundan sonra bizim yaratdığımız obyekt olan sinfin özünün konstruktoru çağırılır. Yəni obyekt yaratarkən əvvəlcə sinif konstruktoru , sonra isə konstruktor Catişləyəcək . Buna əmin olmaq üçün konstruktorlara əlavə edək və konsola çıxış edək. AnimalCatCatAnimal
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();
   }
}
Konsol çıxışı:

Отработал конструктор Animal
Отработал конструктор Cat!
Həqiqətən, hər şey belə işləyir! Bu nə üçündür? Məsələn, iki sinfin ümumi sahələrinin təkrarlanmasının qarşısını almaq üçün. Məsələn, hər heyvanın ürəyi və beyni var, amma hər heyvanın quyruğu yoxdur. Biz ana sinifdə brainbütün heyvanlar üçün ümumi sahələr və alt sinifdə sahə elan edə bilərik . İndi biz sinif üçün konstruktor yaradacağıq , burada hər 3 sahəni keçəcəyik. 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");
   }
}
Diqqət edin:konstruktor uğurla işləyir, baxmayaraq ki, sinifdə Catsahələr brainheart. Bu sahələr əsas sinifdən “yuxarı çəkildi” Animal. Nəsil sinfinin əsas sinfin sahələrinə çıxışı var, ona görə də Catonlar bizim sinfimizdə görünür. CatBuna görə də, bu sahələri sinifdə təkrarlamağa ehtiyac yoxdur - onları sinifdən götürə bilərik Animal. Üstəlik, biz açıq şəkildə nəsil sinfinin konstruktorunda əsas sinfin konstruktorunu çağıra bilərik. Baza sinfi həmçinin “ superclass ” adlanır , buna görə də Java açar sözündən istifadə edir super. Əvvəlki nümunədə
public Cat(String brain, String heart, String tail) {
       this.brain = brain;
       this.heart = heart;
       this.tail = tail;
   }
Biz valideyn sinifimizdə olan hər bir sahəni ayrıca təyin etdik. Əslində, bunu etmək lazım deyil. Ana sinifin konstruktorunu çağırmaq və ona lazımi parametrləri ötürmək kifayətdir:
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");
   }
}
Konstruktorda Catkonstruktoru çağırdıq Animalvə ona iki sahə keçdik. Biz yalnız bir sahəni açıq şəkildə başlatmalıyıq - tailbu, Animalmövcud deyil. Yadınızdadırsa, obyekt yaradılanda ilk olaraq ana sinifin konstruktoru çağırılır demişdik? Beləliklə, super()konstruktorda söz həmişə birinci olmalıdır! Əks halda konstruktorların məntiqi pozulacaq və proqram xəta yaradacaq.
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");
   }
}
Kompilyator bilir ki, nəsil sinfinin obyekti yaradılarkən ilk növbədə əsas sinfin konstruktoru çağırılır. Və bu davranışı əl ilə dəyişdirməyə çalışsanız, buna imkan verməyəcək.

Bir obyektin yaradılması prosesi.

Yuxarıda əsas və ana sinif ilə bir nümunəyə baxdıq - AnimalCat. İndi bu iki sinfi nümunə kimi istifadə edərək, obyektin yaradılması və dəyişənlərin işə salınması prosesinə baxacağıq. Biz bilirik ki, dəyişənlər statik və nümunə dəyişənləridir (qeyri-statik). Biz onu da bilirik ki, baza sinfinin Animalöz dəyişənləri, nəsil sinfinin isə Catöz dəyişənləri var. AnimalAydınlıq Catüçün sinfə bir statik dəyişən əlavə edək . animalCountSinif dəyişəni Animalyer üzündəki heyvan növlərinin ümumi sayı, dəyişən isə catsCountpişik növlərinin sayı olacaq. Bundan əlavə, hər iki sinifin bütün qeyri-statik dəyişənlərinə başlanğıc dəyərləri təyin edəcəyik (sonra konstruktorda dəyişəcək).
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");
   }
}
CatBeləliklə, -dən miras qalmış sinfin yeni obyektini yaradırıq Animal. Nə olacağını və hansı ardıcıllıqla olacağını görmək üçün proqramımıza ətraflı konsol çıxışını əlavə edək. Obyektin yaradılması nəticəsində konsola çıxarılacaq şey budur 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 = Хвост
Beləliklə, indi yeni obyekt yaratarkən dəyişənlərin hansı ardıcıllıqla işə salındığını və konstruktorların çağırıldığını aydın görə bilərik:
  1. Baza sinfinin ( ) statik dəyişənləri işə salınır . Bizim vəziyyətimizdə sinif dəyişəninə 7700000 dəyəri təyin edilir.AnimalanimalCountAnimal

  2. Nəsil sinfinin ( ) statik dəyişənləri işə salınır . Diqqət edin - biz hələ də konstruktorun içərisindəyik və konsol artıq deyir:CatAnimal

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
        Были ли уже проинициализированы переменные класса Cat?
        Текущее meaning статической переменной catsCount = 37
  3. Sonra, baza sinfinin qeyri-statik dəyişənləri işə salınır . Biz onlara xüsusi olaraq ilkin qiymətlər təyin etdik, sonra konstruktorda yeniləri ilə dəyişdirilir. Konstruktor hələ işini başa çatdırmayıb, lakin ilkin dəyərlər artıq təyin edilib :Animalbrainheart

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
  4. Əsas sinif konstruktoru işə başlayır .

    Artıq gördük ki, bu mərhələ ardıcıl dördüncüdür: ilk üç nöqtədə konstruktor işə başladıqda Animalbir çox dəyişənlərə artıq qiymətlər verilmişdir.

  5. Uşaq sinifinin qeyri-statik sahələrinin işə salınması ( ).Cat

    Bu, dizayner Catişə başlamazdan əvvəl baş verir.

    O işə başladığı zaman dəyişənin tailartıq dəyəri var idi:

    
    Конструктор класса Cat начал работу (конструктор Animal уже был выполнен)
    Текущее meaning статической переменной catsCount = 37
    Текущее meaning tail = Изначальное meaning tail в классе Cat
  6. Nəsil sinfinin konstruktoru adlanır Cat

Java-da obyektin yaradılması prosesi belə görünür! Deməliyəm ki, biz sıxışdırmağın böyük pərəstişkarı deyilik, amma dəyişənlərin işə salınması və konstruktorların çağırılması və gələcək üçün xatırlanması qaydasını yadda saxlamaq daha yaxşıdır . Bu, proqramın gedişatı və istənilən an obyektlərinizin vəziyyəti haqqında anlayışınızı xeyli artıracaq. Üstəlik, siniflərdə çox vaxt birbaşa valideyn sinifləri (supersiniflər/baza sinifləri) olmur. Bu halda, əsas siniflə əlaqəli elementlər icra olunmayacaq.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION