JavaRush /Java blogi /Random-UZ /Usulni bekor qilish mexanizmi yoki Java-da Override

Usulni bekor qilish mexanizmi yoki Java-da Override

Guruhda nashr etilgan
Salom! Siz allaqachon Java-da usullardan foydalanasiz va ular haqida ko'p narsalarni bilasiz. Ehtimol, bir sinfda bir xil nomli, ammo turli dalillarga ega bo'lgan ko'plab usullar mavjud bo'lgan vaziyatga duch kelgandirsiz. Esingizda bo'lsa, bunday hollarda biz haddan tashqari yuklash mexanizmidan foydalanganmiz. Bugun boshqa vaziyatni ko'rib chiqamiz. Tasavvur qiling-a, bizda bitta umumiy usul bor, lekin u qaysi sinfga chaqirilganiga qarab turli xil ishlarni bajarishi kerak. Ushbu xatti-harakatni qanday amalga oshirish kerak? Buni tushunish uchun hayvonlarni ifodalovchi ota-onalar sinfini olaylik Animalva unda voiceovoz ” 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. Usulni bekor qilish mexanizmi qanday ishlaydi - 2 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:
  1. Biz har bir avlod sinfida ota-sinfdagi usul bilan bir xil nomdagi usul yaratdik.
  2. 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."

  3. Biz har bir avlod sinfi uchun kerakli dasturni yozdik. Chaqirilsa, ilon voice()xirillashi, ayiq o'kirishi va hokazo.
Keling, bu dasturda qanday ishlashini ko'rib chiqaylik:
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 Animalva 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()AnimalUsulni bekor qilish mexanizmi qanday ishlaydi - 3
  1. Bekor qilingan usul asosiy usul bilan bir xil argumentlarga ega bo'lishi kerak.

    voiceAgar ota-sinfdagi usul kirish sifatida qabul qilsa String, bolalar sinfidagi bekor qilingan usul ham kirish sifatida qabul qilinishi kerak String, 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!");
       }
    }

  2. 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!";
       }
    }

  3. 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!");
       }
    }
Java-da usulni bekor qilish - bu polimorfizm g'oyasini amalga oshirish vositalaridan biri (biz oxirgi ma'ruzada gaplashgan OOP printsipi). Shuning uchun uni ishlatishning asosiy afzalligi biz ilgari aytib o'tgan bir xil moslashuvchanlik bo'ladi. Biz oddiy va mantiqiy sinflar tizimini qurishimiz mumkin, ularning har biri o'ziga xos xulq-atvorga ega bo'ladi (itlar qichqiradi, mushuklar miyovlaydi), lekin bitta interfeys bilan - bir qator voice()usullar o'rniga hamma uchun bitta usul va boshqalar voiceDog().voiceCat()
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION