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 өрісті өткіземіз. heart
Animal
tail
Cat
Cat
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 = Хвост
Сонымен, енді біз жаңа нысанды құру кезінде айнымалылар қандай ретпен инициализацияланғанын және конструкторлар шақырылатынын анық көре аламыз:
-
Негізгі класстың ( ) статикалық айнымалылары инициализацияланған . Біздің жағдайда класс айнымалысына 7700000 мәні тағайындалады.
Animal
animalCount
Animal
-
Ұрпақ класының ( ) статикалық айнымалылары инициализацияланған . Назар аударыңыз - біз әлі де конструктордың ішіндеміз және консоль қазірдің өзінде айтады:
Cat
Animal
Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal Были ли уже проинициализированы переменные класса Cat? Текущее meaning статической переменной catsCount = 37
-
Содан кейін базалық класстың статикалық емес айнымалылары инициализацияланады . Біз оларға бастапқы мәндерді арнайы тағайындадық, содан кейін олар конструкторда жаңаларына өзгертіледі. Конструктор әлі жұмысын аяқтаған жоқ, бірақ бастапқы мәндер тағайындалған :
Animal
brain
heart
Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
-
Негізгі класс конструкторы жұмыс істей бастайды .
Біз бұл кезең тек төртінші қатарда екенін көрдік: алғашқы үш нүктеде конструктор жұмыс істей бастаған кезде
Animal
көптеген айнымалыларға мәндер тағайындалған. -
Еншілес сыныптың статикалық емес өрістерін инициализациялау ( ).
Cat
Бұл дизайнер
Cat
жұмыс істей бастағанға дейін болады.Ол жұмыс істей бастаған кезде айнымалы
tail
мәнге ие болды:Конструктор класса Cat начал работу (конструктор Animal уже был выполнен) Текущее meaning статической переменной catsCount = 37 Текущее meaning tail = Изначальное meaning tail в классе Cat
-
Ұрпақ класының конструкторы деп аталады
Cat
GO TO FULL VERSION