JavaRush /Java блогу /Random-KY /Методду жокко чыгаруу механизми же Javaдагы жокко чыгаруу...

Методду жокко чыгаруу механизми же Javaдагы жокко чыгаруу

Группада жарыяланган
Салам! Сиз буга чейин Java'да ыкмаларды колдоносуз жана алар жөнүндө көп нерсени билесиз. Сиз, балким, бир класста бир эле аталыштагы, бирок ар кандай аргументтүү көптөгөн методдор болгон жагдайга туш болгондурсуз. Эсиңизде болсо, мындай учурларда биз ашыкча жүктөө механизмин колдонгон. Бүгүн башка жагдайды карап көрөлү. Элестеткиле, бизде бир жалпы ыкма бар, бирок ал кайсы класска чакырылганына жараша ар кандай иштерди жасашы керек. Бул жүрүм-турумду кантип ишке ашыруу керек? Аны түшүнүү үчүн, келгиле, Animalжаныбарларды билдирген ата-энелер классын алып, анда методду түзөлү voice- " үн ":
public class Animal {

   public void voice() {

       System.out.println("Voice!");
   }
}
Биз программаны жаңы эле жаза баштаганыбыз менен, мүмкүн болуучу көйгөйдү көрө аласыз: дүйнөдө жаныбарлар көп жана алардын баары ар кандай "сүйлөшөт": мышыктар мияу, өрдөктөр шылдырайт, жыландар ышкырат. Методду жокко чыгаруу механизми кантип иштейт - 2 Биздин максат жөнөкөй: добуш берүү үчүн бир топ ыкмаларды түзүүдөн качуу. voiceCat()Мяулоо, voiceSnake()ышкыруу ж.б.у.с ыкмаларды жасоонун ордуна , voice()ыкма чакырылганда жыландын, мышыктын мияулоосун, иттин үргөнүн каалайбыз. Биз буга ыкманы жокко чыгаруу механизмин колдонуу менен оңой жете алабыз (Java'да Override) . Wikipedia "өткөрүп коюу" терминине төмөнкүдөй түшүндүрмө берет: Объектке багытталган программалоодо методду жокко чыгаруу - бул субкласска же бала класска суперкласстардын биринде ишке ашырылган методдун конкреттүү ишке ашырылышын камсыз кылууга мүмкүндүк берген программалоо тorнин өзгөчөлүктөрүнүн бири. же ата-энелер класстары. Жалпысынан алганда, бул туура. Өткөрүп коюу ата-эне классынын ыкмасын алууга жана ар бир тукум класста бул ыкманы өзүңүздүн ишке ашырууңузга мүмкүндүк берет. Жаңы ишке ашыруу бала классындагы ата-энени "алмаштырат". Келгиле, бул кандай экенин бир мисал менен карап көрөлү. Классыбыз үчүн 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исине дайындадык. Натыйжада ар бир an object өзүн башкача алып жүрөт. Ар бир урпак класстары үчүн жокко чыгарылган ыкма класстын voice()"туулган" ыкмасын алмаштырды (ал жөн гана "Үн!" дегенди консолго чыгарат). Жок кылууда бир катар чектөөлөр бар: voice()AnimalМетодду жокко чыгаруу механизми кантип иштейт - 3
  1. Өчүрүлгөн ыкмада ата-энелик ыкма сыяктуу аргументтер болушу керек.

    voiceЭгерде ата-эне класстагы метод input катары кабыл алса String, бала класстагы жокко чыгарылган метод да input катары кабыл алышы керек 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