Animal
және оған voice
« дауыс » әдісін құрайық:
public class Animal {
public void voice() {
System.out.println("Voice!");
}
}
Бағдарламаны енді ғана жазуды бастасақ та, сіз ықтимал проблеманы көре аласыз: әлемде көптеген жануарлар бар және олардың барлығы әртүрлі «сөйлейді»: мысықтар мияулайды, үйректер дірілдейді, жыландар ызылдайды. Біздің мақсатымыз қарапайым: дауыс берудің көптеген әдістерін жасаудан аулақ болыңыз. 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 пернелер тіркесімін басып, мәзірден « Әдістерді қайта анықтау... » тармағын таңдаңыз . Басынан бастап жылдам пернелерді қолдануға дағдыланыңыз, бұл бағдарлама жазуды тездетеді! Біз қалаған мінез-құлықты орнату үшін біз бірнеше нәрсені жасадық:
- Біз әрбір ұрпақ класында ата-аналық сыныптағы әдіспен бірдей атаумен әдіс жасадық.
-
Біз компиляторға әдісті ата-аналық сыныптағы сияқты атағанымызды айттық: біз оның әрекетін жоққа шығарғымыз келді. Компиляторға осы «хабарлама» үшін әдіске @Override annotationсын қоямыз .
Әдістің үстінде орналасқан @Override annotationсы компиляторға (және сіздің codeты оқитын бағдарламашыларға да): «Бәрі жақсы, бұл қате немесе менің ұмытшақтығым емес. Мұндай әдіс бұрыннан бар екені есімде, мен оны жоққа шығарғым келеді». - Біз әрбір ұрпақ класы үшін қажетті іске асыруды жаздық. Шақырғанда жылан
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
-
Қайта анықталған әдіс негізгі әдіс сияқты бірдей дәлелдерге ие болуы керек.
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!"); } }
-
Қайтарылған әдіс ата-аналық әдіспен бірдей қайтару түріне ие болуы керек.
Әйтпесе, біз компиляция қатесін аламыз:
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!"; } }
-
Қайта анықталған әдістің қол жеткізу модификаторы да «түпнұсқадан» ерекшеленбейді:
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()
әдістердің орнына барлығына бір әдіс voiceDog()
және voiceCat()
т.б.
GO TO FULL VERSION