Metot Geçersiz Kılma (@Override)
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 22 / 87.
Metot geçersiz kılma (Method overriding), bir alt sınıfın, üst sınıfında zaten tanımlanmış olan bir metodun kendi uygulamasını sağlamasına olanak tanır. Bu, alt sınıfların kalıtımla alınan davranışı kendi özel ihtiyaçlarına göre özelleştirme yöntemidir.
Bir metodu geçersiz kıldığınızda (override), alt sınıf versiyonu o alt sınıfın nesneleri için üst sınıfın versiyonunun yerini tamamen alır. Metot, üst sınıf metoduyla aynı isme, dönüş türüne ve parametrelere sahip olmalıdır:
public class Animal {
public void makeSound() {
System.out.println("Some generic sound");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow!");
}
}@Override anotasyonu, derleyiciye bir üst metodu geçersiz kılma (override) niyetinde olduğunuzu bildirir. İsteğe bağlı olsa da, metod adını yanlış yazmanız veya yanlış parametreler kullanmanız durumunda derleyici hataları yakalayacağı için şiddetle tavsiye edilir:
@Override
public void makeSound() { } // Doğru - derleyici bunu doğrular
public void makesound() { } // Yazım hatası! Geçersiz kılmak yerine yeni bir metod oluştururGeçersiz kılınmış (overridden) bir metodu çağırdığınızda, Java gerçek nesne türüne ait olan sürümü çalıştırır:
Dog dog = new Dog();
dog.makeSound(); // Çıktı: Woof!
Cat cat = new Cat();
cat.makeSound(); // Çıktı: Meow!Önceki dersten hatırlayacağınız üzere, yeni kodunuzla birlikte ebeveynin davranışını da dahil etmek istiyorsanız, geçersiz kılınmış bir metodun içinde super.methodName() kullanabilirsiniz.
Görev
KolayAlt sınıfların kendi özel davranışlarını sağlamak için üst sınıf metotlarını nasıl geçersiz kılabileceğini (override) gösteren bir bildirim sistemi oluşturalım. @Override anotasyonunun hataları yakalamaya nasıl yardımcı olduğunu ve her alt sınıfın devralınan metotları nasıl özelleştirebileceğini göreceksiniz.
Kodunuzu düzenlemek için üç dosya oluşturacaksınız:
Notification.java: Genel bir bildirimi temsil eden üst sınıfı oluşturun. Şunlara sahip olmalıdır:message(String) için özel (private) bir alan- Mesajı kabul eden bir yapıcı (constructor) metot
- Mesajı döndüren bir
getMessage()metodu - Şunu yazdıran bir
send()metodu:"Sending notification: " + message
EmailNotification.java: Notification sınıfını genişleten ve bildirimlerin e-posta yoluyla nasıl gönderileceğini özelleştiren bir alt sınıf oluşturun:recipiente-posta adresi (String) için özel (private) bir alan- Hem mesajı hem de alıcıyı alan, üst sınıf kısmı için
super(message)kullanan bir yapıcı metot - Şunu yazdırmak için
@Overrideanotasyonunu kullanaraksend()metodunu geçersiz kılın:"Emailing " + recipient + ": " + getMessage()
Main.java: Aynı metot isminin nesne türüne bağlı olarak nasıl farklı davranışlar ürettiğini gösterin. İki girdi alacaksınız: bir mesaj ve bir e-posta adresi. Aynı mesajla hem normal bir Notification hem de bir EmailNotification oluşturun, ardından farklı çıktıları görmek için her birindesend()metodunu çağırın.
İki girdi alacaksınız: mesaj (String) ve alıcı e-posta adresi (String).
Çıktınız iki satır göstermelidir - ilki üst sınıfın send() metodundan, ikincisi ise EmailNotification içindeki geçersiz kılınmış sürümden. Bu, metot geçersiz kılmanın (method overriding), alt sınıfların devralınan davranışı kendi uygulamalarıyla değiştirmesine nasıl izin verdiğini gösterir.
Kopya kağıdı
Metot geçersiz kılma (method overriding), bir alt sınıfın üst sınıfında zaten tanımlanmış olan bir metodun kendi uygulamasını sağlamasına olanak tanır. Geçersiz kılınan metot, üst sınıftaki metotla aynı isme, dönüş türüne ve parametrelere sahip olmalıdır.
public class Animal {
public void makeSound() {
System.out.println("Some generic sound");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}@Override anotasyonu isteğe bağlıdır ancak şiddetle tavsiye edilir. Derleyiciye bir üst sınıf metodunu geçersiz kılma niyetinde olduğunuzu bildirerek, yanlış yazılmış metot isimleri veya hatalı parametreler gibi hataların yakalanmasına yardımcı olur:
@Override
public void makeSound() { } // Doğru - derleyici bunu doğrular
public void makesound() { } // Yazım hatası! Geçersiz kılmak yerine yeni bir metot oluştururGeçersiz kılınan bir metot çağrıldığında, Java gerçek nesne türüne ait olan sürümü çalıştırır:
Dog dog = new Dog();
dog.makeSound(); // Output: Woof!
Cat cat = new Cat();
cat.makeSound(); // Output: Meow!Yeni kodunuzla birlikte üst sınıfın davranışını da dahil etmek için geçersiz kılınan bir metodun içinde super.methodName() kullanabilirsiniz.
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String message = scanner.nextLine();
String recipient = scanner.nextLine();
// TODO: message ile bir Notification nesnesi oluşturun
// TODO: message ve recipient ile bir EmailNotification nesnesi oluşturun
// TODO: Notification nesnesi üzerinde send() metodunu çağırın
// TODO: EmailNotification nesnesi üzerinde send() metodunu çağırın
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı