Animal
(heyvanımız):
public class Animal {
String name;
int age;
}
Bunun üçün, məsələn, 2 nəsil sinfi yarada bilərik - Cat
və Dog
. Bu açar sözdən istifadə etməklə edilir extends
.
public class Cat extends Animal {
}
public class Dog extends Animal {
}
Bu, gələcəkdə bizim üçün faydalı ola bilər. Məsələn, tapşırıq siçanları tutmaqdırsa, proqramda bir obyekt yaradacağıq Cat
. Əgər tapşırıq bir çubuq arxasınca qaçmaqdırsa, o zaman obyektdən istifadə edirik Dog
. Və əgər biz baytarlıq klinikasını simulyasiya edən bir proqram yaratsaq, o, siniflə işləyəcək Animal
(həm pişikləri, həm də itləri müalicə edə bilmək üçün). Gələcək üçün xatırlamaq çox vacibdir ki , obyekt yaradarkən onun əsas sinifinin konstruktoru əvvəlcə adlanır və yalnız bundan sonra bizim yaratdığımız obyekt olan sinfin özünün konstruktoru çağırılır. Yəni obyekt yaratarkən əvvəlcə sinif konstruktoru , sonra isə konstruktor Cat
işləyəcək . Buna əmin olmaq üçün konstruktorlara əlavə edək və konsola çıxış edək. 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();
}
}
Konsol çıxışı:
Отработал конструктор Animal
Отработал конструктор Cat!
Həqiqətən, hər şey belə işləyir! Bu nə üçündür? Məsələn, iki sinfin ümumi sahələrinin təkrarlanmasının qarşısını almaq üçün. Məsələn, hər heyvanın ürəyi və beyni var, amma hər heyvanın quyruğu yoxdur. Biz ana sinifdə brain
bütün heyvanlar üçün ümumi sahələr və alt sinifdə sahə elan edə bilərik . İndi biz sinif üçün konstruktor yaradacağıq , burada hər 3 sahəni keçəcəyik. 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");
}
}
Diqqət edin:konstruktor uğurla işləyir, baxmayaraq ki, sinifdə Cat
sahələr brain
və heart
. Bu sahələr əsas sinifdən “yuxarı çəkildi” Animal
. Nəsil sinfinin əsas sinfin sahələrinə çıxışı var, ona görə də Cat
onlar bizim sinfimizdə görünür. Cat
Buna görə də, bu sahələri sinifdə təkrarlamağa ehtiyac yoxdur - onları sinifdən götürə bilərik Animal
. Üstəlik, biz açıq şəkildə nəsil sinfinin konstruktorunda əsas sinfin konstruktorunu çağıra bilərik. Baza sinfi həmçinin “ superclass ” adlanır , buna görə də Java açar sözündən istifadə edir super
. Əvvəlki nümunədə
public Cat(String brain, String heart, String tail) {
this.brain = brain;
this.heart = heart;
this.tail = tail;
}
Biz valideyn sinifimizdə olan hər bir sahəni ayrıca təyin etdik. Əslində, bunu etmək lazım deyil. Ana sinifin konstruktorunu çağırmaq və ona lazımi parametrləri ötürmək kifayətdir:
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");
}
}
Konstruktorda Cat
konstruktoru çağırdıq Animal
və ona iki sahə keçdik. Biz yalnız bir sahəni açıq şəkildə başlatmalıyıq - tail
bu, Animal
mövcud deyil. Yadınızdadırsa, obyekt yaradılanda ilk olaraq ana sinifin konstruktoru çağırılır demişdik? Beləliklə, super()
konstruktorda söz həmişə birinci olmalıdır! Əks halda konstruktorların məntiqi pozulacaq və proqram xəta yaradacaq.
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");
}
}
Kompilyator bilir ki, nəsil sinfinin obyekti yaradılarkən ilk növbədə əsas sinfin konstruktoru çağırılır. Və bu davranışı əl ilə dəyişdirməyə çalışsanız, buna imkan verməyəcək.
Bir obyektin yaradılması prosesi.
Yuxarıda əsas və ana sinif ilə bir nümunəyə baxdıq -Animal
və Cat
. İndi bu iki sinfi nümunə kimi istifadə edərək, obyektin yaradılması və dəyişənlərin işə salınması prosesinə baxacağıq. Biz bilirik ki, dəyişənlər statik və nümunə dəyişənləridir (qeyri-statik). Biz onu da bilirik ki, baza sinfinin Animal
öz dəyişənləri, nəsil sinfinin isə Cat
öz dəyişənləri var. Animal
Aydınlıq Cat
üçün sinfə bir statik dəyişən əlavə edək . animalCount
Sinif dəyişəni Animal
yer üzündəki heyvan növlərinin ümumi sayı, dəyişən isə catsCount
pişik növlərinin sayı olacaq. Bundan əlavə, hər iki sinifin bütün qeyri-statik dəyişənlərinə başlanğıc dəyərləri təyin edəcəyik (sonra konstruktorda dəyişəcək).
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
Beləliklə, -dən miras qalmış sinfin yeni obyektini yaradırıq Animal
. Nə olacağını və hansı ardıcıllıqla olacağını görmək üçün proqramımıza ətraflı konsol çıxışını əlavə edək. Obyektin yaradılması nəticəsində konsola çıxarılacaq şey budur 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 = Хвост
Beləliklə, indi yeni obyekt yaratarkən dəyişənlərin hansı ardıcıllıqla işə salındığını və konstruktorların çağırıldığını aydın görə bilərik:
-
Baza sinfinin ( ) statik dəyişənləri işə salınır . Bizim vəziyyətimizdə sinif dəyişəninə 7700000 dəyəri təyin edilir.
Animal
animalCount
Animal
-
Nəsil sinfinin ( ) statik dəyişənləri işə salınır . Diqqət edin - biz hələ də konstruktorun içərisindəyik və konsol artıq deyir:
Cat
Animal
Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal Были ли уже проинициализированы переменные класса Cat? Текущее meaning статической переменной catsCount = 37
-
Sonra, baza sinfinin qeyri-statik dəyişənləri işə salınır . Biz onlara xüsusi olaraq ilkin qiymətlər təyin etdik, sonra konstruktorda yeniləri ilə dəyişdirilir. Konstruktor hələ işini başa çatdırmayıb, lakin ilkin dəyərlər artıq təyin edilib :
Animal
brain
heart
Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
-
Əsas sinif konstruktoru işə başlayır .
Artıq gördük ki, bu mərhələ ardıcıl dördüncüdür: ilk üç nöqtədə konstruktor işə başladıqda
Animal
bir çox dəyişənlərə artıq qiymətlər verilmişdir. -
Uşaq sinifinin qeyri-statik sahələrinin işə salınması ( ).
Cat
Bu, dizayner
Cat
işə başlamazdan əvvəl baş verir.O işə başladığı zaman dəyişənin
tail
artıq dəyəri var idi:Конструктор класса Cat начал работу (конструктор Animal уже был выполнен) Текущее meaning статической переменной catsCount = 37 Текущее meaning tail = Изначальное meaning tail в классе Cat
-
Nəsil sinfinin konstruktoru adlanır
Cat
GO TO FULL VERSION