JavaRush /Java блогы /Random-KK /Негізгі класс конструкторлары

Негізгі класс конструкторлары

Топта жарияланған
Сәлеметсіз бе! Өткен жолы біз конструкторлар туралы сөйлестік және олар туралы көп нәрсені білдік. Енді біз базалық класс конструкторлары туралы айтатын боламыз. Базалық класс дегеніміз не ? Өйткені 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. Егер тапсырма таяқшаның артынан жүгіру болса, онда біз нысанды қолданамыз Dog. Ал егер біз ветеринарлық клиниканы имитациялайтын бағдарлама жасасақ, ол сыныппен жұмыс істейді Animal(мысықтарды да, иттерді де емдей алу үшін). Болашақта 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барлық жануарларға ортақ өрістерді және қосалқы сыныптағы өрісті жариялай аламыз . Енді біз сынып үшін конструктор жасаймыз , онда біз барлық 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");
   }
}
Назар аударыңыз:конструктор табысты жұмыс істейді, дегенмен сыныпта 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. Не болатынын және қандай ретпен болатынын көру үшін бағдарламамызға егжей-тегжейлі консоль шығысын қосамыз. Бұл нысанды жасау нәтижесінде консольге шығарылатын нәрсе 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 = Хвост
Сонымен, енді біз жаңа нысанды құру кезінде айнымалылар қандай ретпен инициализацияланғанын және конструкторлар шақырылатынын анық көре аламыз:
  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 тілінде нысанды жасау процесі осылай көрінеді! Айтуға тиіспін, біз сығымдаудың үлкен жанкүйерлері емеспіз, бірақ айнымалыларды инициализациялау және конструкторларды шақыру және оларды болашақта есте сақтау тәртібін есте сақтаған дұрыс . Бұл бағдарламаның орындалу барысы және кез келген сәтте нысандарыңыздың күйі туралы түсінікті айтарлықтай арттырады. Сонымен қатар, сыныптарда көбінесе тікелей ата-аналық сыныптар (жоғарғы сыныптар/негізгі сыныптар) болмайды. Бұл жағдайда негізгі сыныппен байланысты элементтер орындалмайды.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION