MERHABA! Zaten Java yöntemlerini kullanıyorsunuz ve onlar hakkında çok şey biliyorsunuz. Muhtemelen bir sınıfın aynı ada ancak farklı parametrelere sahip birçok yöntemi olduğu durumla karşılaşmışsınızdır. Bu durumlarda metot aşırı yükleme kullandığımızı hatırlayacaksınız. Bugün başka bir durumu ele alıyoruz. Tek bir paylaşılan yöntemimiz olduğunu, ancak farklı sınıflarda farklı şeyler yapması gerektiğini hayal edin. Bu davranışı nasıl uygularız? Anlamak için, hayvanları temsil eden bir Animal ebeveyn sınıfını ele alalım ve bunun içinde bir konuşma yöntemi oluşturacağız :
Amacımız basit: Bir sürü konuşma yöntemi oluşturmaktan kaçının. Miyavlamak için bir catSpeak() yöntemi, tıslama için bir snakeSpeak() yöntemi oluşturmak yerine , talk() işlevini çağırmak istiyoruz.yöntemi ve yılanın tıslamasını, kedinin miyavlamasını ve köpeğin havlamasını sağlayın. Yöntem geçersiz kılmayı kullanarak bunu kolayca başarabiliriz. Vikipedi, 'geçersiz kılma' teriminin şu açıklamasını verir: Nesne yönelimli programlamada yöntem geçersiz kılma, bir alt sınıfın veya alt sınıfın, ü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. ebeveyn sınıfları Bu esasen doğrudur. Yöntem geçersiz kılma, üst sınıfın bazı yöntemlerini alıp her alt sınıfa kendi uygulamanızı yazmanıza olanak tanır. Yeni uygulama, ebeveynin çocuk sınıfındaki uygulamasının yerini alır. Bunun bir örnekte nasıl göründüğüne bakalım. Animal sınıfımızı devralan 4 sınıf oluşturun :
public class Animal {
public void speak() {
System.out.println("Hello!");
}
}
Programı yazmaya daha yeni başlamış olsak da, muhtemelen potansiyel bir sorun görüyorsunuz: Dünyada çok sayıda hayvan var ve hepsi farklı 'konuşuyor': kediler miyavlıyor, ördekler vaklıyor ve yılanlar tıslıyor. 
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: üst sınıfın yöntemlerini geçersiz kılmak için IntelliJ IDE'de alt sınıfın koduna gidin, Ctrl+O'ya tıklayın ve menüden "Yöntemleri geçersiz kıl..." seçeneğini seçin. Kısayol tuşlarını kullanmaya alışın en başından — programları daha hızlı yazmanıza yardımcı olacak! İhtiyacımız olan davranışı belirtmek için birkaç şey yaptık:
- Her alt sınıfta, üst sınıfın yöntemiyle aynı ada sahip bir yöntem oluşturduk.
- Derleyiciye, yöntemi üst sınıftakiyle aynı şekilde adlandırmanın tesadüf olmadığını söyledik: davranışını geçersiz kılmak istiyoruz. Bunu derleyiciye iletmek için, yöntemin üzerine @Override açıklamasını koyuyoruz.
Bir yöntemin üzerine yerleştirildiğinde, @Override ek açıklaması derleyiciyi (ve kodunuzu okuyan programcıları) bilgilendirir: 'Her şey yolunda. Bu bir hata değil. Ben unutkan değilim. Böyle bir yöntemin zaten var olduğunun farkındayım ve onu geçersiz kılmak istiyorum'. - Her çocuk sınıfı için ihtiyacımız olan uygulamayı yazdık. Talk() yöntemi çağrıldığında , bir yılan tıslamalı, bir 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! Animal ebeveyn sınıfının nesnelerini saklayan 4 referans değişkeni yarattık ve bunlara 4 farklı alt sınıfın örneklerini atadık. Sonuç olarak, her nesne kendi davranışını sergiler. Her alt sınıf için geçersiz kılınan talk() yöntemi, Animal sınıfındaki (yalnızca 'Merhaba!' görüntüleyen) 'yerel' talk() yönteminin yerini aldı. Geçersiz kılmanın birkaç sınırlaması vardır: 
-
Geçersiz kılınan yöntem, ana yöntemle aynı parametrelere sahip olmalıdır.
Üst sınıfın talk yönteminde bir String parametresi varsa, alt sınıftaki geçersiz kılınan yöntemin de bir String parametresi olmalıdır. Aksi takdirde, derleyici bir hata üretecektir:
public class Animal { public void speak(String s) { System.out.println("Hello! " + s); } } public class Cat extends Animal { @Override // Error! public void speak() { System.out.println("Meow!"); } }
-
Geçersiz kılınan yöntem, ana yöntemle aynı dönüş türüne sahip olmalıdır.
Aksi takdirde, bir derleyici 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öntemdeki erişim değiştiricisi de 'orijinal' yöntemle aynı olmalıdır:
public class Animal { public void speak() { System.out.println("Hello!"); } } public class Cat extends Animal { @Override private void speak() { // Error! System.out.println("Meow!"); } }
GO TO FULL VERSION