Animal
bir metot oluşturalım :speak
public class Animal {
public void speak() {
System.out.println("Hello!");
}
}
Programımızı yazmaya yeni başlamış olmamıza rağmen, muhtemelen potansiyel bir sorun görebilirsiniz: dünya bir sürü hayvanla dolu ve hepsi farklı "konuşuyor": kediler miyavlıyor, ördekler vaklıyor, yılanlar tıslıyor, vs. konuşmak için bir sürü yöntem oluşturmaktan kaçınmak istiyorum. meow()
Miyavlama, tıslama vb. için bir yöntem oluşturmak yerine , yöntem çağrıldığında hiss()
yılanın tıslamasını, kedinin miyavlamasını ve köpeğin havlamasını istiyoruz . Yöntem geçersiz kılmaspeak()
kullanarak bunu kolayca başarabiliriz . Wikipedia terimi şu şekilde açıklar: Yöntem geçersiz kılma, nesne yönelimli programlamada, bir alt sınıfın veya alt sınıfın, üst sınıflarından veya üst sınıflarından biri tarafından zaten sağlanan bir yöntemin belirli bir uygulamasını sağlamasına izin veren bir dil özelliğidir. Bu temelde doğru. Geçersiz kılma, bir üst sınıfın bazı yöntemlerini almanıza ve türetilmiş her sınıfa kendi uygulamanızı yazmanıza olanak tanır. Alt sınıftaki yeni uygulama, üst sınıftakinin yerini alır. Bunun nasıl göründüğünü bir örnekle görelim. Sınıfımızın 4 soyunu oluşturalım Animal
:
public class Bear extends Animal {
@Override
public void speak() {
System.out.println("Growl!");
}
}
public class Cat extends Animal {
@Override
public void speak() {
System.out.println("Meow!");
}
}
public class Dog extends Animal {
@Override
public void speak() {
System.out.println("Woof!");
}
}
public class Snake extends Animal {
@Override
public void speak() {
System.out.println("Hiss!");
}
}
İşte gelecek için küçük bir yaşam tüyosu: bir üst sınıfın yöntemlerini geçersiz kılmak için IntelliJ IDE'de türetilmiş sınıfın koduna gidin, Ctrl +O tuşlarına basın ve menüden Yöntemleri geçersiz kıl... öğesini seçin. En başından kısayol tuşlarını kullanmaya alışın. Kodlamayı hızlandıracaklar! İstenen davranışı elde etmek için birkaç şey yaptık:
- Her alt sınıfta, üst sınıftaki yöntemle aynı ada sahip bir yöntem oluşturduk.
-
Derleyiciye, yönteme yalnızca üst sınıftakiyle aynı adı vermediğimizi, bunun yerine davranışını geçersiz kılmak istediğimizi söyledik. Derleyiciye gönderilen bu "mesaj", @Override ek açıklaması aracılığıyla iletilir.
Bir yöntemin üzerindeki @Override ek açıklaması, derleyiciye (diğer programcıların da kodunuzu okumasıyla birlikte) "Endişelenmeyin. Bu bir hata veya gözden kaçırma değil. Bu yöntemin zaten var olduğunun farkındayım ve onu geçersiz kılmak istiyorum" der. . - Her bir alt sınıf için ihtiyacımız olan uygulamayı yazdık. Yöntem
speak()
çağrıldığında yılan tıslamalı, ayı hırlamalı vb.
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.speak();
animal2.speak();
animal3.speak();
animal4.speak();
}
}
Konsol çıktısı:
Woof!
Meow!
Growl!
Hiss!
Harika, her şey olması gerektiği gibi çalışıyor! Türü üst sınıf olan 4 referans değişkeni yarattık Animal
ve onlara alt sınıfların 4 farklı nesnesini atadık. Sonuç olarak, her nesne farklı davranır. Türetilmiş sınıfların her biri için geçersiz kılınan yöntem, sınıfın speak()
mevcut yönteminin yerini alır (konsolda yalnızca "Speaking: " görüntülenir). Yöntem geçersiz kılmanın birkaç sınırlaması vardır: speak()
Animal
-
Geçersiz kılınan bir yöntem, üst sınıftaki yöntemle aynı bağımsız değişkenlere sahip olmalıdır.
speak
Üst sınıfın yöntemi girdi olarak a alıyorsa ,String
alt sınıftaki geçersiz kılınan yöntem deString
girdi olarak a almalıdır. Aksi takdirde, derleyici bir hata üretecektir:public class Animal { public void speak(String s) { System.out.println("Speaking: " + s); } } public class Cat extends Animal { @Override // Error! public void speak() { System.out.println("Meow!"); } }
-
Geçersiz kılınan yöntem, üst sınıftaki yöntemle aynı dönüş türüne sahip olmalıdır.
Aksi takdirde, bir derleme hatası alırız:
public class Animal { public void speak() { System.out.println("Hello!"); } } public class Cat extends Animal { @Override public String speak() { // Error! System.out.println("Meow!"); return "Meow!"; } }
-
Geçersiz kılınan yöntemin erişim değiştiricisi de orijinal olandan farklı olamaz:
public class Animal { public void speak() { System.out.println("Hello!"); } } public class Cat extends Animal { @Override private void speak() { // Error! System.out.println("Meow!"); } }
speak()
bir grup farklı yöntem yerine herkes için tek bir yöntem, örneğin bark()
, meow()
, vb.
GO TO FULL VERSION