Yöntem yeniden tanımlama (overriding), bir alt sınıfın, süper sınıfında zaten tanımlanmış bir yöntemin kendi uygulamasını sağlamasıdır. Alt sınıftaki yöntem aynı isme, parametrelere ve geri dönüş değerinin türüne (veya onun alt türüne) sahip olmalıdır.
Ana kurallar:
@Override anotasyonunun kullanımı hataları derleme aşamasında bulmaya yardımcı olur.Örnek:
class Animal { public void sound() { System.out.println("Bazı sesler"); } } class Dog extends Animal { @Override public void sound() { System.out.println("Hav hav"); } }
Soru: "Java'da static yöntemi yeniden tanımlamak mümkün mü?"
Cevap: Hayır, static yöntemler yeniden tanımlanamaz. Onlar gizlenir (method hiding). Eğer alt sınıfta aynı imzaya sahip bir static yöntem tanımlanırsa, bu gizlenme olur, yeniden tanımlama değil.
Örnek:
class A { static void print() { System.out.println("A"); } } class B extends A { static void print() { System.out.println("B"); } } A obj = new B(); obj.print(); // "A" yazdırır
Hikaye
Projede bir geliştirici, miras alınan sınıfta bir static yöntemi "yeniden tanımlamaya" çalıştı ve süper sınıf referansıyla alt sınıfın sürümünü çağırmayı bekliyordu. Bu beklenmeyen sonuçlara yol açtı: süper sınıfın yöntemi çağrıldı, bu da programın doğru çalışmamasına neden oldu.
Hikaye
@Overrideanotasyonunu kullanmak önemlidir. Bir projede, bir geliştirici, yeniden tanımlama sırasında yöntemin adında hata yaptı ve anotasyon olmadan derleyici hata vermedi. Sonuç olarak, miras alma şemasında varsayılan olarak süper sınıfın yöntemi çağrıldı, bu da iş süreçlerinde yanlış bir mantığa yol açtı.
Hikaye
Checked-istisnaların üzerine yazma: Bir geliştirici, alt sınıfta yeniden tanımlanan yöntemde yeni bir checked-istisna fırlatma ekledi, bu istisna orijinal imzada yoktu. Kod hata ile derlendi ve bunu değiştirmek zorunda kaldı çünkü bu, istisna yeniden tanımlama kuralını ihlal ediyordu.