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и нав тағирёбандаҳо бо кадом тартиб оғоз карда мешаванд ва конструкторҳо даъват карда мешаванд:
-
Тағйирёбандаҳои статикии синфи асосӣ ( ) оғоз карда мешаванд
Animal
. Дар ҳолати мо, ба тағирёбандаиanimalCount
синфAnimal
арзиши 7700000 дода мешавад. -
Тағйирёбандаҳои статикии синфи насли ( ) оғоз карда мешаванд
Cat
. Диққат диҳед - мо ҳоло ҳам дар дохor конструктор ҳастем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