Albatta, bir nechta argumentlar bilan bir xil nomga ega bo'lgan ko'plab methodlar mavjud bo'lgan sinfga duch kelgansan. Agar eslasang, o'sha hollarda biz methodlarni overload qilish mexanizmidan foydalanganmiz. Bugun boshqa bir vaziyatni ko'rib chiqamiz. Tasavvur qil, bitta umumiy method bor, lekin u chaqirilgan sinfga qarab turli narsalarni bajarishi kerak. Bunday xatti-harakatni qanday amalga oshiramiz? Tushunish uchun,
Animal degan ota sinfni olamiz va unda
voice — «
ovoz» methodini yaratamiz:
public class Animal {
public void voice() {
System.out.println("Ovoz!");
}
}
Dastur boshlaganimiz bilan, ehtimol potentsial muammo senga ko'rinib turadi: dunyoda hayvonlar juda ko'p va har biri o'ziga xos "gapiradi": mushuklar miyovlaydi, o'rdaklar qag'illaydi, ilonlar shivirlaydi.
Bizning maqsadimiz oddiy: ovoz chiqarish uchun ko'plab methodlar yaratishdan qochish.
voiceCat() methodini yaratish o'rniga,
voiceSnake() methodini ilonlar uchun va hokazo, biz xohlaymizki,
voice() methodi chaqirilganda ilon shivirlasin, mushuk miyovlasin, it esa vovullasin. Bunga biz methodlarni
override qilish (Override in Java) yordami bilan osongina erishamiz. Wikipedia bu terminni shunday tushuntiradi:
Method overriding — bu dasturlash tilining imkoniyatlaridan biri bo'lib, subklass yoki farzand sinfga ota sinf (yoki bir nechta ota sinflardan biri) tomonidan allaqachon amalga oshirilgan methodning o'ziga xos amalga oshirilishini ta'minlash imkonini beradi. Bu, umuman olganda, to'g'ri. Override qilish ota sinfning bir methodini olib, har bir merosxo'r sinfda o'zingizning realizatsiyangizni yozishga imkon beradi. Yangi amalga oshirish farzand sinfda ota sinfni "o'rnini bosadi". Misolni ko'rib chiqaylik.
Animal sinfimiz uchun 4ta merosxo'r sinf yaratamiz:
public class Bear extends Animal {
@Override
public void voice() {
System.out.println("R-r-r!");
}
}
public class Cat extends Animal {
@Override
public void voice() {
System.out.println("Miyov!");
}
}
public class Dog extends Animal {
@Override
public void voice() {
System.out.println("Vov!");
}
}
public class Snake extends Animal {
@Override
public void voice() {
System.out.println("Sh-sh-sh!");
}
}
Kelajak uchun kichik bir maslahat: ota sinf methodlarini override qilish uchun, merosxo'r sinf kodiga
Intellij IDEa,
Ctrl+O ni bosing va "Override methods..." menyusidan tanlang. Dasturlar yozishni tezlashtirish uchun boshidan "qaynoq tugmachalardan" foydalanishga odatlan! Kerakli xatti-harakatni belgilash uchun bir nechta narsalarni qildik:
- Har bir merosxo'r sinfda ota sinfdagidek nomlangan methodni yaratdik.
Kompilyatorga biz methodni ota sinfda qanday nomlanganini bilishimiz kerakligini va uning xatti-harakatini o'zgartirishimizni bildirdik. Kompilyatorga bu "xabar" uchun, method ustida @Override annotatsiyasini qo'ydik ("override qilingan").
Method ustida qo'yilgan @Override annotatsiyasi kompilyatorga (va qodingni o'qiyotgan dasturchilarga ham): "Hammasi joyida, bu xato emas va mening unutuvchanligim emas. Men bu methodni eslayman va uning xatti-harakatini o'zgartirmoqchiman" deb bildiradi.- Har bir farzand sinfda kerakli realizatsiyani yozdik.
voice()chaqirilganda ilon shivirlasin, ayiq rrr lasin va hokazo.
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
Animal animal3 = new Bear();
Animal animal4 = new Snake();
animal1.voice();
animal2.voice();
animal3.voice();
animal4.voice();
}
}
Konsolda chiqarish:
Vov! Miyov! R-r-r! Sh-sh-sh! Zo'r, hammasi kerakli tarzda ishladi! Biz 4ta ota sinf
Animal havola o'zgaruvchisini yaratdik va ularga 4ta har xil merosxo'r sinf obyektini tayinladik. Natijada, har bir obyekt o'ziga xos tarzda ishlaydi. Har bir merosxo'r sinf uchun override qilingan
voice() methodi ota sinfdagi
voice() methodini "almashtirdi" (bu method konsolda shunchaki "Ovoz!" chiqarardi).
Override qilishning bir qator cheklovlari mavjud:
Override qilingan methodning argumentlari ota method bilan bir xil bo'lishi kerak.
Agar ota sinf
voicemethodiStringqabul qilsa, unda merosxo'r sinfdagi override qilingan method hamStringturidagi argument qabul qilishi kerak, aks holda kompilyator xato beradi:public class Animal { public void voice(String s) { System.out.println("Ovoz! " + s); } } public class Cat extends Animal { @Override//xato! public void voice() { System.out.println("Miyov!"); } }Override qilingan methodning qaytarish turi ota method bilan bir xil bo'lishi kerak.
Aks holda kompilyatsiya xatosiga olib keladi:
public class Animal { public void voice() { System.out.println("Ovoz!"); } } public class Cat extends Animal { @Override public String voice() { //xato! System.out.println("Miyov!"); return "Miyov!"; } }Override qilingan methodning dasturlashda ishlatiladigan mo'ljallashlari "original" methoddan farq qilmasligi kerak:
public class Animal { public void voice() { System.out.println("Ovoz!"); } } public class Cat extends Animal { @Override private void voice() { //xato! System.out.println("Miyov!"); } }
voice() methodini ko'pchilik uchun
voiceDog(),
voiceCat() va hokazo ko'plab methodlar o'rniga.
GO TO FULL VERSION