JavaRush /Java blogi /Random-UZ /Asosiy sinf konstruktorlari

Asosiy sinf konstruktorlari

Guruhda nashr etilgan
Salom! O'tgan safar biz konstruktorlar haqida gaplashdik va ular haqida ko'p narsalarni bilib oldik. Endi biz asosiy sinf konstruktorlari kabi narsa haqida gaplashamiz. Asosiy sinf nima ? Gap shundaki, Java-da bir nechta turli sinflar umumiy kelib chiqishi mumkin. Bu merosxo'rlikAsosiy sinf konstruktorlari - 2 deyiladi . Bir nechta avlod sinflari bitta umumiy ajdod sinfiga ega bo'lishi mumkin. Masalan, bizda sinf (hayvon) borligini tasavvur qiling: Animal
public class Animal {

   String name;
   int age;
}
Biz buning uchun, masalan, 2 avlod sinfini yaratishimiz mumkin - Catva Dog. Bu kalit so'z yordamida amalga oshiriladi extends.
public class Cat extends Animal {

}

public class Dog extends Animal {

}
Bu kelajakda biz uchun foydali bo'lishi mumkin. Misol uchun, agar vazifa sichqonchani tutish bo'lsa, biz dasturda ob'ekt yaratamiz Cat. Agar vazifa tayoq ortidan yugurish bo'lsa, unda biz ob'ektdan foydalanamiz Dog. Va agar biz veterinariya klinikasini taqlid qiladigan dastur yaratsak, u sinf bilan ishlaydi Animal(mushuk va itlarni davolash imkoniyatiga ega bo'lish uchun). Kelajakda shuni yodda tutish kerakki , ob'ektni yaratishda birinchi navbatda uning asosiy sinfining konstruktori chaqiriladi va shundan keyingina biz yaratayotgan ob'ekt sinfning o'zi konstruktori chaqiriladi. Ya'ni, ob'ektni yaratishda birinchi navbatda sinf konstruktori , keyin esa konstruktor Catishlaydi . Bunga ishonch hosil qilish uchun konstruktorlarga qo'shamiz va konsolga chiqamiz. 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 chiqishi:

Отработал конструктор Animal
Отработал конструктор Cat!
Darhaqiqat, hammasi shunday ishlaydi! Bu nima uchun? Masalan, ikkita sinfning umumiy maydonlarini takrorlamaslik uchun. Masalan, har bir hayvonning yuragi va miyasi bor, lekin har bir hayvonning dumi bo'lmaydi. Biz ota-sinfdagi brainbarcha hayvonlar uchun umumiy maydonlarni va kichik sinfdagi maydonni e'lon qilishimiz mumkin . Endi biz sinf uchun konstruktor yaratamiz , u erda biz barcha 3 maydonni o'tkazamiz. 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");
   }
}
Diqqat qilish:konstruktor muvaffaqiyatli ishlaydi, garchi sinfda Catmaydonlar brainva heart. Bu maydonlar asosiy sinfdan "yuqoriga tortildi" Animal. Avlod sinfi asosiy sinf maydonlariga kirish huquqiga ega, shuning uchun Catular bizning sinfimizda ko'rinadi. CatShuning uchun biz ushbu maydonlarni sinfda takrorlashimiz shart emas - biz ularni sinfdan olishimiz mumkin Animal. Bundan tashqari, biz aniq avlod sinfining konstruktorida asosiy sinf konstruktorini chaqirishimiz mumkin. Asosiy sinf " superklass " deb ham ataladi, shuning uchun Java kalit so'zidan foydalanadi super. Oldingi misolda
public Cat(String brain, String heart, String tail) {
       this.brain = brain;
       this.heart = heart;
       this.tail = tail;
   }
Biz ota-ona sinfimizdagi har bir maydonni alohida tayinladik. Aslida, buni qilish shart emas. Ota-klass konstruktorini chaqirish va unga kerakli parametrlarni topshirish kifoya:
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 Catbiz konstruktorni chaqirdik Animalva unga ikkita maydonni uzatdik. Biz faqat bitta maydonni ishga tushirishimiz kerak - tailu Animalmavjud emas. Ob'ekt yaratilganda, birinchi navbatda ota-klassning konstruktori chaqiriladi, deb aytganimizni eslaysizmi? super()Demak, shuning uchun konstruktorda so'z doimo birinchi o'rinda turishi kerak! Aks holda, konstruktorlarning mantig'i buziladi va dastur xatolik hosil qiladi.
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 avlod sinfining ob'ektini yaratishda birinchi navbatda asosiy sinfning konstruktori chaqirilishini biladi. Va agar siz ushbu xatti-harakatni qo'lda o'zgartirishga harakat qilsangiz, u bunga yo'l qo'ymaydi.

Ob'ektni yaratish jarayoni.

Yuqorida biz asosiy va ota-klass bilan misolni ko'rib chiqdik - Animalva Cat. Endi bu ikki sinfdan misol sifatida foydalanib, ob'ektni yaratish va o'zgaruvchilarni ishga tushirish jarayonini ko'rib chiqamiz. Biz bilamizki, o'zgaruvchilar statik va misol o'zgaruvchilari (statik bo'lmagan). Bundan tashqari, biz asosiy sinfning Animalo'z o'zgaruvchilari va avlod sinfining Cato'z o'zgaruvchilari borligini bilamiz. AnimalAniqlik Catuchun sinfga bitta statik o'zgaruvchini qo'shamiz . animalCountSinf o'zgaruvchisi Animaler yuzidagi hayvonlar turlarining umumiy soni, o'zgaruvchisi esa catsCountmushuk turlarining soni bo'ladi. Bundan tashqari, biz ikkala sinfning barcha statik bo'lmagan o'zgaruvchilariga boshlang'ich qiymatlarni tayinlaymiz (keyinchalik konstruktorda o'zgaradi).
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");
   }
}
CatShunday qilib, biz dan meros qolgan sinfning yangi ob'ektini yaratamiz Animal. Keling, nima sodir bo'lishini va qanday tartibda ko'rish uchun dasturimizga batafsil konsol chiqishini qo'shamiz. Bu ob'ektni yaratish natijasida konsolga chiqadigan narsa 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 = Хвост
Shunday qilib, endi biz yangi ob'ektni yaratishda o'zgaruvchilar qanday tartibda ishga tushirilishi va konstruktorlar chaqirilishini aniq ko'rishimiz mumkin:
  1. Asosiy sinfning ( ) statik o'zgaruvchilari ishga tushiriladi . Bizning holatda, sinf o'zgaruvchisiga 7700000 qiymati beriladi.AnimalanimalCountAnimal

  2. Avlod sinfining ( ) statik o'zgaruvchilari ishga tushiriladi . E'tibor bering - biz hali ham konstruktor ichidamiz va konsol allaqachon aytadi:CatAnimal

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
        Были ли уже проинициализированы переменные класса Cat?
        Текущее meaning статической переменной catsCount = 37
  3. Keyinchalik, asosiy sinfning statik bo'lmagan o'zgaruvchilari ishga tushiriladi . Biz ularga dastlabki qiymatlarni maxsus tayinladik, keyinchalik ular konstruktorda yangilariga o'zgartiriladi. Konstruktor hali o'z ishini tugatmagan, ammo dastlabki qiymatlar allaqachon tayinlangan:Animalbrainheart

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
  4. Asosiy sinf konstruktori ishlay boshlaydi .

    Biz allaqachon ko'rdikki, bu bosqich ketma-ket to'rtinchi bosqichdir: dastlabki uch nuqtada, konstruktor ishlay boshlagan paytda, Animalko'plab o'zgaruvchilarga allaqachon qiymatlar berilgan.

  5. Bolalar sinfining statik bo'lmagan maydonlarini ishga tushirish ( ).Cat

    Bu dizayner Catish boshlashdan oldin sodir bo'ladi.

    U ishlay boshlaganida, o'zgaruvchi tailallaqachon qiymatga ega edi:

    
    Конструктор класса Cat начал работу (конструктор Animal уже был выполнен)
    Текущее meaning статической переменной catsCount = 37
    Текущее meaning tail = Изначальное meaning tail в классе Cat
  6. Avlod sinfining konstruktori deyiladi Cat

Java-da ob'ekt yaratish jarayoni shunday ko'rinadi! Aytishim kerakki, biz siqilishning katta muxlislari emasmiz, lekin o'zgaruvchilarni ishga tushirish va konstruktorlarni chaqirish va ularni kelajakda eslab qolish tartibini yodlash yaxshiroqdir . Bu sizning dasturning borishi va istalgan vaqtda ob'ektlaringiz holatini tushunishingizni sezilarli darajada oshiradi. Bundan tashqari, sinflarda ko'pincha to'g'ridan-to'g'ri ota-onalar sinflari (supersinflar/tayanch sinflar) mavjud emas. Bunday holda, asosiy sinf bilan bog'langan elementlar bajarilmaydi.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION