JavaRush /Kurslar /All lectures for UZ purposes /Methodlarni override qilish

Methodlarni override qilish

All lectures for UZ purposes
Daraja, Dars
Mavjud
Salom! Sen Java'da methodlardan foydalanayapsan va ular haqida ko'p narsani bilasan. Methodlarni override qilish mexanizmi qanday ishlaydi - 1Albatta, 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. Methodlarni override qilish mexanizmi qanday ishlaydi - 2 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:
  1. Har bir merosxo'r sinfda ota sinfdagidek nomlangan methodni yaratdik.
  2. 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.

  3. Har bir farzand sinfda kerakli realizatsiyani yozdik. voice() chaqirilganda ilon shivirlasin, ayiq rrr lasin va hokazo.
Keling, dasturda bu qanday ishlashini ko'raylik:

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). Methodlarni override qilish mexanizmi qanday ishlaydi - 3 Override qilishning bir qator cheklovlari mavjud:
  1. Override qilingan methodning argumentlari ota method bilan bir xil bo'lishi kerak.

    Agar ota sinf voice methodi String qabul qilsa, unda merosxo'r sinfdagi override qilingan method ham String turidagi 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!");
       }
    }
    

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

  3. 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!");
       }
    }
    
Methodlarni override qilish Java'da — polimorfizm g'oyasini amalga oshirish vositalaridan biri. Shuning uchun, uning asosiy afzalligi avval aytilgan moslashuvchanlik bo'ladi. Biz sodda va mantiqiy sinflar tizimini qurishimiz mumkin, har biri o'ziga xos xatti-harakatga ega bo'ladi (itlar vovullaydi, mushuklar miyovlaydi), lekin bitta interfeysga ega bo'ladi — voice() methodini ko'pchilik uchun voiceDog(), voiceCat() va hokazo ko'plab methodlar o'rniga.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION