Animal
və orada bir üsul yaradaq voice
- “ səs ”:
public class Animal {
public void voice() {
System.out.println("Voice!");
}
}
Proqramı yenicə yazmağa başlasaq da, çox güman ki, potensial problemi görə bilərsiniz: dünyada çoxlu heyvanlar var və onların hamısı fərqli “danışır”: pişiklər miyavlayır, ördəklər şarladır, ilanlar fısıldayır. Məqsədimiz sadədir: səs vermək üçün bir dəstə üsul yaratmaqdan çəkinin. voiceCat()
Miyavlama, voiceSnake()
fısıltı və s üsullar yaratmaq əvəzinə , voice()
üsul çağırılan zaman ilanın, pişiyin miyavlamasını, itin hürməsini istəyirik. Biz buna asanlıqla metodu ləğvetmə mexanizmindən istifadə edə bilərik (Java-da Override) . Vikipediya “əsas alma” termininin aşağıdakı izahını verir: Obyekt yönümlü proqramlaşdırmada metodun üstünlüyü, alt sinifə və ya uşaq sinfə yuxarı siniflərdən birində artıq tətbiq edilmiş metodun xüsusi həyata keçirilməsini təmin etməyə imkan verən proqramlaşdırma dilinin xüsusiyyətlərindən biridir. və ya valideyn sinifləri. Ümumiyyətlə, düzgündür. Üstündən təyinetmə sizə valideyn sinfinin metodunu götürməyə və hər bir nəsil sinfində bu metodun öz tətbiqini yazmağa imkan verir. Yeni tətbiq uşaq sinfində valideyni "əvəz edəcək". Bir nümunə ilə bunun necə göründüyünü görək. Sinifimiz üçün 4 ardıcıl sinif yaradaq : 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("Ш-ш-ш!");
}
}
Gələcək üçün kiçik bir həyat hacki: ana sinifin metodlarını ləğv etmək üçün Intellij IDE a -da nəsil sinfin koduna keçin , Ctrl+O düymələrini basın və menyudan “ Metodları ləğv et... ” seçin. Əvvəldən isti düymələrdən istifadə etməyə alışın, bu proqramların yazılmasını sürətləndirəcək! İstədiyimiz davranışı qurmaq üçün bir neçə şey etdik:
- Biz hər bir nəsil sinfində ana sinifdəki metodla eyni adda bir metod yaratdıq.
-
Kompilyatora dedik ki, metodu ana sinifdəki kimi adlandırdıq: biz onun davranışını ləğv etmək istədik. Kompilyatora bu "mesaj" üçün metoda @Override annotasiyası qoyuruq .
Metodun üstündə yerləşdirilmiş @Override annotasiyası tərtibçiyə (və kodunuzu oxuyan proqramçılara da) deyir: “Hər şey qaydasındadır, bu səhv və ya mənim unutqanlığım deyil. Yadımdadır ki, belə bir üsul artıq mövcuddur və mən onu ləğv etmək istəyirəm”. - Hər bir nəsil sinfi üçün lazım olan tətbiqi yazdıq. Çağırılanda ilan
voice()
fısıldamalı, ayı nərilməlidir və s.
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();
}
}
Konsol çıxışı: Vay! Miyav! Rrrr! şşşş! Əla, hər şey lazım olduğu kimi işləyir! Biz ana sinifin 4 istinad dəyişənini yaratdıq Animal
və onları nəsil siniflərin 4 müxtəlif obyektinə təyin etdik. Nəticədə hər bir obyekt fərqli davranır. Nəsil siniflərinin hər biri üçün ləğv edilmiş metod sinifdən voice()
“doğma” metodu əvəz etdi (sadəcə konsola “Səs!” verir). Üstündən təyinetmə bir sıra məhdudiyyətlərə malikdir: voice()
Animal
-
Üstündən təyin edilmiş metod ana metodla eyni arqumentlərə malik olmalıdır.
voice
Ana sinifdəki metod giriş kimi qəbul edərsəString
, uşaq sinifdə ləğv edilmiş metod da giriş kimi qəbul etməlidirString
, əks halda kompilyator xəta atacaq: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!"); } }
-
Yenidən təyin edilmiş metod ana metodla eyni qaytarma növünə malik olmalıdır.
Əks halda, tərtib etmə xətası alacağıq:
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!"; } }
-
Ləğv edilmiş metodun giriş modifikatoru da “orijinal”dan fərqlənə bilməz:
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()
dəstə metod əvəzinə hamı üçün bir üsul və s voiceDog()
.voiceCat()
GO TO FULL VERSION