JavaRush /Блоги Java /Random-TG /Конструкторҳои синфи асосӣ

Конструкторҳои синфи асосӣ

Дар гурӯҳ нашр шудааст
Салом! Дафъаи гузашта мо дар бораи конструкторҳо сӯҳбат кардем ва дар бораи онҳо бисёр чизҳоро омӯхтем. Ҳоло мо дар бораи чунин чизе ба монанди конструкторҳои синфи базавӣ сӯҳбат хоҳем кард. Синфи асосӣ чист ? Гап дар он аст, ки дар Java якчанд синфҳои гуногун метавонанд пайдоиши умумӣ дошта бошанд. Ин меросКонструкторҳои синфи асосӣ - 2 номида мешавад . Якчанд синфҳои насл метавонанд як синфи аҷдодии умумӣ дошта бошанд. Масалан, тасаввур кунед, ки мо як синф (ҳайвон) дорем: Animal
public class Animal {

   String name;
   int age;
}
Мо метавонем барои он, масалан, 2 синфи насли - Catва Dog. Ин бо истифода аз калимаи калидӣ анҷом дода мешавад extends.
public class Cat extends Animal {

}

public class Dog extends Animal {

}
Ин метавонад дар оянда барои мо муфид бошад. Масалан, агар вазифа сайд кардани мушҳо бошад, мо дар барнома an object эҷод мекунем Cat. Агар вазифа аз паси чӯб давидан бошад, пас мо an objectро истифода мебарем Dog. Ва агар мо як барномаеро эҷод кунем, ки клиникаи byteориро тақлид мекунад, он бо синф кор хоҳад кард Animal(барои он ки ҳам гурбаҳо ва ҳам сагҳоро табобат карда тавонанд). Барои оянда дар хотир доштан хеле муҳим аст, ки ҳангоми сохтани an object аввал конструктори синфи асосии он номида мешавад ва танҳо баъд конструктори худи синф, ки an objectи онро мо эҷод карда истодаем, номида мешавад. Яъне ҳангоми сохтани an object 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дар heartсинфи волидайн Animalва майдонро tailдар зерсинф эълон кунем Cat. Ҳоло мо барои синф як конструктор эҷод мекунем Cat, ки дар он ҳамаи 3 майдонро мегузарем.
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майдонхо brainва heart. Ин майдонҳо аз синфи асосӣ "бардошта шуданд" 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мавҷуд нест. Дар хотир доред, ки чӣ тавр мо гуфта будем, ки ҳангоми сохтани an object аввал конструктори синфи волидайн даъват карда мешавад? Аз ин рӯ, калима 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");
   }
}
Компилятор медонад, ки ҳангоми сохтани an objectи синфи насли аввал конструктори синфи базавӣ даъват карда мешавад. Ва агар шумо кӯшиш кунед, ки ин рафторро дастӣ тағир диҳед, он имкон намедиҳад.

Раванди эҷоди an object.

Дар боло мо як мисолро бо синфҳои асосӣ ва волидайн дида баромадем - Animalва Cat. Ҳоло, бо истифода аз ин ду синф ба сифати мисол, мо раванди эҷоди an object ва оғоз кардани тағирёбандаҳоро дида мебароем. Мо медонем, ки тағирёбандаҳо статикӣ ва тағирёбандаҳои мисолӣ мебошанд (ғайристатикӣ). Мо инчунин медонем, ки синфи базавӣ 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");
   }
}
Ҳамин тавр, мо an objectи нави синферо эҷод мекунем, Catки аз Animal. Биёед ба барномаи худ баромади муфассали консолро илова кунем, то бубинем, ки чӣ рӯй медиҳад ва бо кадом тартиб. Ин аст он чизе ки дар натиҷаи эҷоди an object ба консол бароварда мешавад 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 = Хвост
Ҳамин тавр, ҳоло мо равшан мебинем, ки ҳангоми сохтани an objectи нав тағирёбандаҳо бо кадом тартиб оғоз карда мешаванд ва конструкторҳо даъват карда мешаванд:
  1. Тағйирёбандаҳои статикии синфи асосӣ ( ) оғоз карда мешаванд Animal. Дар ҳолати мо, ба тағирёбандаи animalCountсинф Animalарзиши 7700000 дода мешавад.

  2. Тағйирёбандаҳои статикии синфи насли ( ) оғоз карда мешаванд Cat. Диққат диҳед - мо ҳоло ҳам дар дохor конструктор ҳастем Animalва консол аллакай мегӯяд:

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
        Были ли уже проинициализированы переменные класса Cat?
        Текущее meaning статической переменной catsCount = 37
  3. Баъдан, тағирёбандаҳои ғайристатикии синфи асосӣ оғоз карда мешаванд . Мо ба онҳо махсусан арзишҳои ибтидоӣ таъин кардем, ки баъдан дар конструктор ба арзишҳои нав иваз карда мешаванд. Конструктор Animalкори худро ҳанӯз анҷом надодааст, аммо арзишҳои ибтидоӣ аллакай таъин шудаанд brain:heart

    
        Выполняется конструктор базового класса 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

Раванди сохтани an object дар Java чунин аст! Ман бояд бигӯям, ки мо мухлисони ашаддии пурборкунӣ нестем, аммо беҳтар аст, ки тартиби оғоз кардани тағирёбандаҳо ва даъвати конструкторҳоро дар хотир нигоҳ дорем ва онҳоро барои оянда дар хотир нигоҳ дорем . Ин фаҳмиши шуморо дар бораи пешрафти барнома ва ҳолати an objectҳои шумо дар ҳар лаҳза зиёд мекунад. Гузашта аз ин, дарсҳо аксар вақт синфҳои волидайн надоранд (суперсинфҳо/синфҳои асосӣ). Дар ин ҳолат, ҷузъҳои марбут ба синфи асосӣ иҷро намешаванд.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION