JavaRush /Java блогу /Random-KY /Базалык класстын конструкторлору

Базалык класстын конструкторлору

Группада жарыяланган
Салам! Өткөн жолу биз конструкторлор жөнүндө сүйлөшүп , алар жөнүндө көп нерселерди билдик. Эми биз базалык класстын конструкторлору жөнүндө сүйлөшөбүз. Негизги класс деген эмне ? Чындыгында 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. Ал эми ветеринардык клиниканы окшоштурган программа түзсөк, ал класс менен иштешет Animal(мышыктарды да, иттерди да дарылай алуу үчүн). Объектти түзүүдө анын базалык классынын конструктору адегенде , андан кийин гана биз түзүп жаткан класстын конструктору деп аталаарын эстен чыгарбоо абдан маанилүү . Башкача айтканда, an objectти түзүүдө класстын конструктору адегенде , андан кийин гана конструктор Catиштейт . Буга ынануу үчүн консольго конструкторлорду кошуп , чыгаралы.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();
   }
}
Консолдук чыгаруу:

Отработал конструктор Animal
Отработал конструктор Cat!
Чынында эле, баары ушундай иштейт! Бул эмне үчүн? Мисалы, эки класстын жалпы талааларын кайталоону болтурбоо үчүн. Мисалы, ар бир жаныбардын жүрөгү жана мээси бар, бирок ар бир жаныбардын куйругу болбойт. Биз негизги класстагы brainбардык жаныбарлар үчүн жалпы талааларды жана субкласстагы талааны жарыялай алабыз . Эми биз класс үчүн конструктор түзөбүз , анда биз бардык 3 талааны өткөрөбүз. 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");
   }
}
Көңүл буруу:конструктор ийгorктүү иштейт, бирок класста 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жок. Объект түзүлгөндө ата-эне класстын конструктору биринчи чакырылат деп айтканыбызды эстейсизби? Демек, 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исин түзүүдө негизги класстын конструктору биринчи чакырыларын билет. Ал эми бул жүрүм-турумду кол менен өзгөртүүгө аракет кылсаңыз, ага жол бербейт.

Объектти түзүү процесси.

Жогоруда биз базалык жана ата-энелер классы менен мисалды карадык - 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");
   }
}
CatОшентип , биз класстын жаңы an objectин түзөбүз 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. Негизги класстын статикалык өзгөрмөлөрү ( ) инициализацияланат . Биздин учурда класс өзгөрмөсүнө 7700000 мааниси ыйгарылган.AnimalanimalCountAnimal

  2. Тукум класстын статикалык өзгөрмөлөрү ( ) инициализацияланат . Көңүл буруңуз - биз дагы эле конструктордун ичиндебиз жана консол буга чейин мындай дейт:CatAnimal

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
        Были ли уже проинициализированы переменные класса Cat?
        Текущее meaning статической переменной catsCount = 37
  3. Андан кийин, базалык класстын статикалык эмес өзгөрмөлөрү инициализацияланат . Биз аларга атайын баштапкы маанилерди ыйгардык, алар конструктордо жаңысына өзгөртүлөт. Конструктор али ишин аяктай элек, бирок баштапкы баалуулуктар буга чейин дайындалган :Animalbrainheart

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

Объектти түзүү процесси Javaда ушундай көрүнөт! Айтып коюшум керек, биз тырышуунун чоң күйөрмандары эмеспиз, бирок өзгөрмөлөрдү инициализациялоо жана конструкторлорду чакыруу тартибин жаттап алып, аларды келечекте эстеп калуу жакшыраак . Бул программанын жүрүшү жана an objectилериңиздин ар кандай учурда абалы жөнүндө түшүнүгүңүздү бир топ жогорулатат. Андан тышкары, класстарда көбүнчө түз ата-энелер класстары болбойт (суперкласстар/базалык класстар). Бул учурда, базалык класс менен байланышкан нерселер аткарылbyte.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION