Animal
va unda voice
“ ovoz ” usulini yaratamiz:
public class Animal {
public void voice() {
System.out.println("Voice!");
}
}
Garchi biz dasturni endigina yozishni boshlagan bo'lsak-da, ehtimol siz yuzaga kelishi mumkin bo'lgan muammoni ko'rishingiz mumkin: dunyoda juda ko'p hayvonlar bor va ularning barchasi boshqacha "gapiradi": mushuklar miyovlaydi, o'rdaklar xirillaydi, ilonlar xirillaydi. Bizning maqsadimiz oddiy: ovoz berish uchun bir qator usullarni yaratishdan saqlaning. voiceCat()
Biz miyovlash, voiceSnake()
xirillash va hokazo usullarni yaratish o‘rniga , voice()
usul chaqirilganda ilonning xirillashini, mushukning miyovlashini va itning hurishini xohlaymiz. Bunga usulni bekor qilish mexanizmi (Java-da bekor qilish) yordamida osongina erishishimiz mumkin . Vikipediya "o'tdan belgilash" atamasiga quyidagi izohni beradi: Ob'ektga yo'naltirilgan dasturlashda usulni bekor qilish dasturlash tilining xususiyatlaridan biri bo'lib, pastki sinf yoki bolalar sinfiga yuqori sinflardan birida allaqachon amalga oshirilgan usulning o'ziga xos amalga oshirilishini ta'minlash imkonini beradi. yoki ota-onalar sinflari. Umuman olganda, bu to'g'ri. Qayta belgilash sizga ota-ona sinfining usulini olish va har bir avlod sinfida ushbu usulni o'z amalga oshirishingizni yozish imkonini beradi. Yangi dastur bolalar sinfidagi ota-onaning o'rnini bosadi. Keling, bu qanday ko'rinishini misol bilan ko'rib chiqaylik. Keling, sinfimiz uchun 4 ta o'rinbosar sinf yarataylik : Animal
public class Bear extends Animal {
@Override
public void voice() {
System.out.println("Р-р-р!");
}
}
public class Cat extends Animal {
@Override
public void voice() {
System.out.println("Meow!");
}
}
public class Dog extends Animal {
@Override
public void voice() {
System.out.println("Woof!");
}
}
public class Snake extends Animal {
@Override
public void voice() {
System.out.println("Ш-ш-ш!");
}
}
Kelajak uchun kichik hayot xakeri: ota-onalar sinfining usullarini bekor qilish uchun Intellij IDE a -da avlod sinfining kodiga o'ting , Ctrl+O tugmalarini bosing va menyudan “ Uslublarni bekor qilish... ” ni tanlang. Boshidanoq tezkor tugmalardan foydalanishga odatlaning, bu dasturlarni yozishni tezlashtiradi! Biz xohlagan xatti-harakatni o'rnatish uchun biz bir nechta ishlarni qildik:
- Biz har bir avlod sinfida ota-sinfdagi usul bilan bir xil nomdagi usul yaratdik.
-
Biz kompilyatorga bir sababga ko'ra usulni ota-ona sinfidagi kabi nomlaganimizni aytdik: biz uning xatti-harakatlarini bekor qilmoqchi edik. Ushbu kompilyatorga "xabar" uchun biz usulga @Override izohini qo'ydik .
Usul ustida joylashgan @Override izohi kompilyatorga (va sizning kodingizni o'qiyotgan dasturchilar ham) aytadi: “Hammasi joyida, bu xato yoki mening unutuvchanligim emas. Men bunday usul allaqachon borligini eslayman va men uni bekor qilmoqchiman." - Biz har bir avlod sinfi uchun kerakli dasturni yozdik. Chaqirilsa, ilon
voice()
xirillashi, ayiq o'kirishi 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();
}
}
Konsol chiqishi: Voy! Myau! Rrrr! Shhh! Ajoyib, hamma narsa kerak bo'lganidek ishlaydi! Biz ota-klassning 4 ta mos yozuvlar o'zgaruvchilarini yaratdik Animal
va ularni avlod sinflarining 4 xil ob'ektiga tayinladik. Natijada, har bir ob'ekt o'zini boshqacha tutadi. Har bir avlod sinfi uchun bekor qilingan usul sinfdan voice()
“native” usulini almashtirdi (bu “Ovoz!” ni konsolga chiqaradi). Qayta belgilash bir qator cheklovlarga ega: voice()
Animal
-
Bekor qilingan usul asosiy usul bilan bir xil argumentlarga ega bo'lishi kerak.
voice
Agar ota-sinfdagi usul kirish sifatida qabul qilsaString
, bolalar sinfidagi bekor qilingan usul ham kirish sifatida qabul qilinishi kerakString
, aks holda kompilyator xatoga yo'l qo'yadi:public class Animal { public void voice(String s) { System.out.println("Voice! " + s); } } public class Cat extends Animal { @Override//error! public void voice() { System.out.println("Meow!"); } }
-
Qaytarilgan usul asosiy usul bilan bir xil qaytish turiga ega bo'lishi kerak.
Aks holda, biz kompilyatsiya xatosini olamiz:
public class Animal { public void voice() { System.out.println("Voice!"); } } public class Cat extends Animal { @Override public String voice() { //error! System.out.println("Meow!"); return "Meow!"; } }
-
Bekor qilingan usulning kirish modifikatori ham "asl"dan farq qilishi mumkin emas:
public class Animal { public void voice() { System.out.println("Voice!"); } } public class Cat extends Animal { @Override private void voice() { //error! System.out.println("Meow!"); } }
voice()
usullar o'rniga hamma uchun bitta usul va boshqalar voiceDog()
.voiceCat()
GO TO FULL VERSION