Animal
public class Animal {
String name;
int age;
}
Biz buning uchun, masalan, 2 avlod sinfini yaratishimiz mumkin - Cat
va Dog
. Bu kalit so'z yordamida amalga oshiriladi extends
.
public class Cat extends Animal {
}
public class Dog extends Animal {
}
Bu kelajakda biz uchun foydali bo'lishi mumkin. Misol uchun, agar vazifa sichqonchani tutish bo'lsa, biz dasturda ob'ekt yaratamiz Cat
. Agar vazifa tayoq ortidan yugurish bo'lsa, unda biz ob'ektdan foydalanamiz Dog
. Va agar biz veterinariya klinikasini taqlid qiladigan dastur yaratsak, u sinf bilan ishlaydi Animal
(mushuk va itlarni davolash imkoniyatiga ega bo'lish uchun). Kelajakda shuni yodda tutish kerakki , ob'ektni yaratishda birinchi navbatda uning asosiy sinfining konstruktori chaqiriladi va shundan keyingina biz yaratayotgan ob'ekt sinfning o'zi konstruktori chaqiriladi. Ya'ni, ob'ektni yaratishda birinchi navbatda sinf konstruktori , keyin esa konstruktor Cat
ishlaydi . Bunga ishonch hosil qilish uchun konstruktorlarga qo'shamiz va konsolga chiqamiz. 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 chiqishi:
Отработал конструктор Animal
Отработал конструктор Cat!
Darhaqiqat, hammasi shunday ishlaydi! Bu nima uchun? Masalan, ikkita sinfning umumiy maydonlarini takrorlamaslik uchun. Masalan, har bir hayvonning yuragi va miyasi bor, lekin har bir hayvonning dumi bo'lmaydi. Biz ota-sinfdagi brain
barcha hayvonlar uchun umumiy maydonlarni va kichik sinfdagi maydonni e'lon qilishimiz mumkin . Endi biz sinf uchun konstruktor yaratamiz , u erda biz barcha 3 maydonni o'tkazamiz. 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");
}
}
Diqqat qilish:konstruktor muvaffaqiyatli ishlaydi, garchi sinfda Cat
maydonlar brain
va heart
. Bu maydonlar asosiy sinfdan "yuqoriga tortildi" Animal
. Avlod sinfi asosiy sinf maydonlariga kirish huquqiga ega, shuning uchun Cat
ular bizning sinfimizda ko'rinadi. Cat
Shuning uchun biz ushbu maydonlarni sinfda takrorlashimiz shart emas - biz ularni sinfdan olishimiz mumkin Animal
. Bundan tashqari, biz aniq avlod sinfining konstruktorida asosiy sinf konstruktorini chaqirishimiz mumkin. Asosiy sinf " superklass " deb ham ataladi, shuning uchun Java kalit so'zidan foydalanadi super
. Oldingi misolda
public Cat(String brain, String heart, String tail) {
this.brain = brain;
this.heart = heart;
this.tail = tail;
}
Biz ota-ona sinfimizdagi har bir maydonni alohida tayinladik. Aslida, buni qilish shart emas. Ota-klass konstruktorini chaqirish va unga kerakli parametrlarni topshirish kifoya:
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
biz konstruktorni chaqirdik Animal
va unga ikkita maydonni uzatdik. Biz faqat bitta maydonni ishga tushirishimiz kerak - tail
u Animal
mavjud emas. Ob'ekt yaratilganda, birinchi navbatda ota-klassning konstruktori chaqiriladi, deb aytganimizni eslaysizmi? super()
Demak, shuning uchun konstruktorda so'z doimo birinchi o'rinda turishi kerak! Aks holda, konstruktorlarning mantig'i buziladi va dastur xatolik hosil qiladi.
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 avlod sinfining ob'ektini yaratishda birinchi navbatda asosiy sinfning konstruktori chaqirilishini biladi. Va agar siz ushbu xatti-harakatni qo'lda o'zgartirishga harakat qilsangiz, u bunga yo'l qo'ymaydi.
Ob'ektni yaratish jarayoni.
Yuqorida biz asosiy va ota-klass bilan misolni ko'rib chiqdik -Animal
va Cat
. Endi bu ikki sinfdan misol sifatida foydalanib, ob'ektni yaratish va o'zgaruvchilarni ishga tushirish jarayonini ko'rib chiqamiz. Biz bilamizki, o'zgaruvchilar statik va misol o'zgaruvchilari (statik bo'lmagan). Bundan tashqari, biz asosiy sinfning Animal
o'z o'zgaruvchilari va avlod sinfining Cat
o'z o'zgaruvchilari borligini bilamiz. Animal
Aniqlik Cat
uchun sinfga bitta statik o'zgaruvchini qo'shamiz . animalCount
Sinf o'zgaruvchisi Animal
er yuzidagi hayvonlar turlarining umumiy soni, o'zgaruvchisi esa catsCount
mushuk turlarining soni bo'ladi. Bundan tashqari, biz ikkala sinfning barcha statik bo'lmagan o'zgaruvchilariga boshlang'ich qiymatlarni tayinlaymiz (keyinchalik konstruktorda o'zgaradi).
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
Shunday qilib, biz dan meros qolgan sinfning yangi ob'ektini yaratamiz Animal
. Keling, nima sodir bo'lishini va qanday tartibda ko'rish uchun dasturimizga batafsil konsol chiqishini qo'shamiz. Bu ob'ektni yaratish natijasida konsolga chiqadigan narsa 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 = Хвост
Shunday qilib, endi biz yangi ob'ektni yaratishda o'zgaruvchilar qanday tartibda ishga tushirilishi va konstruktorlar chaqirilishini aniq ko'rishimiz mumkin:
-
Asosiy sinfning ( ) statik o'zgaruvchilari ishga tushiriladi . Bizning holatda, sinf o'zgaruvchisiga 7700000 qiymati beriladi.
Animal
animalCount
Animal
-
Avlod sinfining ( ) statik o'zgaruvchilari ishga tushiriladi . E'tibor bering - biz hali ham konstruktor ichidamiz va konsol allaqachon aytadi:
Cat
Animal
Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal Были ли уже проинициализированы переменные класса Cat? Текущее meaning статической переменной catsCount = 37
-
Keyinchalik, asosiy sinfning statik bo'lmagan o'zgaruvchilari ishga tushiriladi . Biz ularga dastlabki qiymatlarni maxsus tayinladik, keyinchalik ular konstruktorda yangilariga o'zgartiriladi. Konstruktor hali o'z ishini tugatmagan, ammo dastlabki qiymatlar allaqachon tayinlangan:
Animal
brain
heart
Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
-
Asosiy sinf konstruktori ishlay boshlaydi .
Biz allaqachon ko'rdikki, bu bosqich ketma-ket to'rtinchi bosqichdir: dastlabki uch nuqtada, konstruktor ishlay boshlagan paytda,
Animal
ko'plab o'zgaruvchilarga allaqachon qiymatlar berilgan. -
Bolalar sinfining statik bo'lmagan maydonlarini ishga tushirish ( ).
Cat
Bu dizayner
Cat
ish boshlashdan oldin sodir bo'ladi.U ishlay boshlaganida, o'zgaruvchi
tail
allaqachon qiymatga ega edi:Конструктор класса Cat начал работу (конструктор Animal уже был выполнен) Текущее meaning статической переменной catsCount = 37 Текущее meaning tail = Изначальное meaning tail в классе Cat
-
Avlod sinfining konstruktori deyiladi
Cat
GO TO FULL VERSION