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, bir alt sınıfın üst sınıfında zaten tanımlanmış bir metot için kendi uygulamasını sağlamasına olanak tanır. Alt sınıflar, kalıtsal davranışı kendi özel ihtiyaçlarına uyacak şekilde bu şekilde özelleştirir.
Bir yöntemi geçersiz kıldığınızda, alt sınıf sürümü, o alt sınıfın nesneleri için üst sınıfın sürümünün yerini tamamen alır. Yöntem, üst sınıf yöntemindekiyle aynı ada ve parametrelere, ayrıca üst sınıf yönteminkiyle aynı (veya onun bir alt türü olan) dönüş türüne 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 ek açıklaması, derleyiciye bir üst sınıfın yöntemini geçersiz kılmayı amaçladığınızı bildirir. İsteğe bağlı olsa da kesinlikle önerilir; çünkü yöntemin adını yanlışlıkla yazarsanız veya yanlış parametreler kullanırsanız derleyici hataları yakalar:
@Override
public void makeSound() { } // Doğru - derleyici bunu doğrular
public void makesound() { } // Yazım hatası! Override etmek yerine yeni metot oluştururGeçersiz kılınmış 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, yeni kodunuzla birlikte ebeveyn sınıfın davranışını da dahil etmek istiyorsanız, geçersiz kılınmış bir metodun içinde super.methodName() kullanabileceğinizi hatırlayın.
Görev
KolayAlt sınıfların kendi özelleştirilmiş davranışlarını sağlamak için üst sınıf yöntemlerini nasıl geçersiz kılabildiğini gösteren bir bildirim sistemi oluşturalım. @Override ek açıklamasının hataları yakalamaya nasıl yardımcı olduğunu ve her alt sınıfın devralınan yöntemleri nasıl özelleştirebildiğini göreceksin.
Kodunu düzenlemek için üç dosya oluşturacaksın:
Notification.java: Genel bir bildirimi temsil eden üst sınıfı oluştur:message(String) için özel bir alan- Mesajı kabul eden bir kurucu
- Mesajı döndüren bir
getMessage()yöntemi - Şunu yazdıran bir
send()yöntemi: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ştur:recipiente-posta adresi (String) için özel bir alan- Hem mesajı hem de alıcıyı alan ve üst sınıfa ait kısım için
super(message)kullanan bir kurucu @Overrideek açıklamasını kullanaraksend()yöntemini geçersiz kıl ve şunu yazdır:Emailing [recipient]: [message]
Main.java: Aynı yöntem adının nesne türüne bağlı olarak nasıl farklı davranış ürettiğini göster. İki girdi alacaksın: bir mesaj ve bir e-posta adresi. Aynı mesaja sahip hem normal bir Notification hem de bir EmailNotification oluştur, ardından farklı çıktıları görmek için her birindesend()yöntemini çağır.
İki girdi alacaksın: mesaj (String) ve alıcının e-posta adresi (String).
Çıktın iki satır göstermeli: önce üst sınıfın send() yönteminden, ardından EmailNotification içindeki geçersiz kılınmış sürümden gelen satır. Bu, yöntem geçersiz kılmanın alt sınıfların devralınan davranışı kendi uygulamalarıyla değiştirmesine nasıl olanak tanıdığını gösterir.
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: Create a Notification object with the message
// TODO: Create an EmailNotification object with the message and recipient
// TODO: Call send() on the Notification object
// TODO: Call send() on the EmailNotification object
}
}
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ıKendi başına pratik yap: Online Java derleyicisi