Animal
жаныбарларды билдирген ата-энелер классын алып, анда методду түзөлү voice
- " үн ":
public class Animal {
public void voice() {
System.out.println("Voice!");
}
}
Биз программаны жаңы эле жаза баштаганыбыз менен, мүмкүн болуучу көйгөйдү көрө аласыз: дүйнөдө жаныбарлар көп жана алардын баары ар кандай "сүйлөшөт": мышыктар мияу, өрдөктөр шылдырайт, жыландар ышкырат. Биздин максат жөнөкөй: добуш берүү үчүн бир топ ыкмаларды түзүүдөн качуу. 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 баскычтарын басыңыз жана менюдан “ Методдорду жокко чыгаруу... ” тандаңыз. Ыкчам баскычтарды башынан колдонууга көнүңүз, бул программа жазууну тездетет! Биз каалаган жүрүм-турумду орнотуу үчүн, биз бир нече иштерди жасадык:
- Биз ар бир тукум класста ата-эне класстагы метод менен бирдей аталыштагы метод түздүк.
-
Биз компиляторго методду ата-эне класстагыдай эле атаганыбызды айттык: биз анын жүрүм-турумун жокко чыгаргыбыз келди. Бул компиляторго "билдирүү" үчүн биз методго @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исине дайындадык. Натыйжада ар бир an object өзүн башкача алып жүрөт. Ар бир урпак класстары үчүн жокко чыгарылган ыкма класстын voice()
"туулган" ыкмасын алмаштырды (ал жөн гана "Үн!" дегенди консолго чыгарат). Жок кылууда бир катар чектөөлөр бар: voice()
Animal
-
Өчүрүлгөн ыкмада ата-энелик ыкма сыяктуу аргументтер болушу керек.
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!"); } }
-
Өчүрүлгөн ыкма ата-эне ыкмасы менен бирдей кайтаруу түрүнө ээ болушу керек.
Болбосо, биз компиляция катасын алабыз:
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