JavaRush /Java блогы /Random-KK /Әдісті қайта анықтау механизмі немесе Java тіліндегі Over...

Әдісті қайта анықтау механизмі немесе Java тіліндегі Override

Топта жарияланған
Сәлеметсіз бе! Сіз Java-да әдістерді қолданасыз және олар туралы көп білесіз. Сіз бір сыныпта аттас, бірақ дәлелдері әртүрлі көптеген әдістер болған жағдайға тап болған шығарсыз. Естеріңізде болса, мұндай жағдайларда біз шамадан тыс жүктеу механизмін қолдандық. Бүгін басқа жағдайды қарастырайық. Бізде бір жалпы әдіс бар деп елестетіп көріңіз, бірақ ол қай сыныпқа шақырылғанына байланысты әртүрлі әрекеттерді орындауы керек. Бұл мінез-құлықты қалай жүзеге асыруға болады? Оны анықтау үшін жануарларды белгілейтін ата-аналар класын алайық Animalжәне оған voice« дауыс » әдісін құрайық:
public class Animal {

   public void voice() {

       System.out.println("Voice!");
   }
}
Бағдарламаны енді ғана жазуды бастасақ та, сіз ықтимал проблеманы көре аласыз: әлемде көптеген жануарлар бар және олардың барлығы әртүрлі «сөйлейді»: мысықтар мияулайды, үйректер дірілдейді, жыландар ызылдайды. Әдісті қайта анықтау механизмі қалай жұмыс істейді - 2 Біздің мақсатымыз қарапайым: дауыс берудің көптеген әдістерін жасаудан аулақ болыңыз. voiceCat()Мияу, ысқыру т.б әдістерді жасаудың орнына , әдіс шақырылғанда жыланның ысқырғанын, мысықтың мияулағанын, иттің үргенін voiceSnake()қалаймыз . voice()Біз бұған әдісті қайта анықтау механизмі арқылы оңай қол жеткізе аламыз (Java-да Override) . Википедияда «басқа анықтау» терминінің келесі түсіндірмесі берілген: Объектіге бағытталған бағдарламалауда әдісті қайта анықтау – қосалқы сыныпқа немесе еншілес сыныпқа жоғарғы сыныптардың бірінде бұрыннан іске асырылған әдісті нақты іске асыруды қамтамасыз етуге мүмкіндік беретін бағдарламалау тілінің ерекшеліктерінің бірі. немесе ата-аналар сыныптары. Жалпы, бұл дұрыс. Қайта анықтау ата-аналық сыныптың әдісін алуға және әрбір ұрпақ класында осы әдісті жеке іске асыруды жазуға мүмкіндік береді. Жаңа енгізу балалар сыныбында ата-ананы «алмастыру» болады. Мысал арқылы бұл қалай көрінетінін көрейік. Сыныбымыз үшін 4 ізбасар класын жасайық : 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("Ш-ш-ш!");
   }
}
Болашаққа арналған шағын лайфхак: ата-аналық сыныптың әдістерін қайта анықтау үшін Intellij IDE a ішіндегі ұрпақ класының codeына өтіп, Ctrl+O пернелер тіркесімін басып, мәзірден « Әдістерді қайта анықтау... » тармағын таңдаңыз . Басынан бастап жылдам пернелерді қолдануға дағдыланыңыз, бұл бағдарлама жазуды тездетеді! Біз қалаған мінез-құлықты орнату үшін біз бірнеше нәрсені жасадық:
  1. Біз әрбір ұрпақ класында ата-аналық сыныптағы әдіспен бірдей атаумен әдіс жасадық.
  2. Біз компиляторға әдісті ата-аналық сыныптағы сияқты атағанымызды айттық: біз оның әрекетін жоққа шығарғымыз келді. Компиляторға осы «хабарлама» үшін әдіске @Override annotationсын қоямыз .
    Әдістің үстінде орналасқан @Override annotationсы компиляторға (және сіздің codeты оқитын бағдарламашыларға да): «Бәрі жақсы, бұл қате немесе менің ұмытшақтығым емес. Мұндай әдіс бұрыннан бар екені есімде, мен оны жоққа шығарғым келеді».

  3. Біз әрбір ұрпақ класы үшін қажетті іске асыруды жаздық. Шақырғанда жылан voice()ысқырады, аю ырылдасын, т.б.
Бұл бағдарламада қалай жұмыс істейтінін көрейік:
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();
   }
}
Консоль шығысы: Уф! Мияу! Rrrr! Тынш! Тамаша, бәрі қажетінше жұмыс істейді! Біз ата-аналық сыныптың 4 анықтамалық айнымалысын жасадық Animalжәне оларды ұрпақ кластарының 4 түрлі нысанына тағайындадық. Нәтижесінде әр an object әртүрлі әрекет етеді. Ұрпақ кластарының әрқайсысы үшін қайта анықталған әдіс сыныптағы voice()«туған» әдісті ауыстырды (ол жай ғана «Дауыс!» консольге шығарады). Қайта анықтаудың бірқатар шектеулері бар: voice()AnimalӘдісті қайта анықтау механизмі қалай жұмыс істейді - 3
  1. Қайта анықталған әдіс негізгі әдіс сияқты бірдей дәлелдерге ие болуы керек.

    voiceЕгер ата-аналық сыныптағы әдіс кіріс ретінде қабылдаса String, еншілес сыныптағы қайта анықталған әдіс енгізу ретінде де қабылдауы керек String, әйтпесе компилятор қате жібереді:

    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. Қайтарылған әдіс ата-аналық әдіспен бірдей қайтару түріне ие болуы керек.

    Әйтпесе, біз компиляция қатесін аламыз:

    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. Қайта анықталған әдістің қол жеткізу модификаторы да «түпнұсқадан» ерекшеленбейді:

    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 тіліндегі әдісті қайта анықтау полиморфизм идеясын жүзеге асыру құралдарының бірі болып табылады (соңғы дәрісте айтқан OOP принципі). Сондықтан оны пайдаланудың басты артықшылығы біз бұрын айтқан икемділік болады. Біз қарапайым және логикалық сыныптар жүйесін құра аламыз, олардың әрқайсысында нақты мінез-құлық болады (иттер үреді, мысықтар мияулайды), бірақ бір интерфейспен - көптеген voice()әдістердің орнына барлығына бір әдіс voiceDog()және voiceCat()т.б.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION