Metot Geçersiz Kılma (Çalışma Zamanı)
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 29 / 87.
Metot aşırı yükleme derleme zamanında çözümlenirken, metot geçersiz kılma çalışma zamanı polimorfizmini gösterir. Burada Java, program fiilen çalışırken hangi metodun yürütüleceğine, değişkenin bildirilen türünden ziyade nesnenin gerçek türüne dayanarak karar verir.
Kalıtım bölümünde metot ezme hakkında bilgi edindin. Bunu polimorfik yapan şey, bir üst sınıf referansı bir alt sınıf nesnesini gösterdiğinde Java'nın bunu nasıl ele aldığıdır:
public class Animal {
public void speak() {
System.out.println("Some sound");
}
}
public class Dog extends Animal {
@Override
public void speak() {
System.out.println("Bark!");
}
}
public class Cat extends Animal {
@Override
public void speak() {
System.out.println("Meow!");
}
}Şimdi üst tür başvurularını kullandığımızda ne olduğunu gözlemleyin:
Animal myPet = new Dog();
myPet.speak(); // Çıktı: Bark!
myPet = new Cat();
myPet.speak(); // Çıktı: Meow!myPet Animal olarak bildirilmiş olsa da Java, geçersiz kılınan yöntemi çalışma zamanında gerçek nesne türüne göre çağırır. Buna dinamik yöntem dağıtımı denir. JVM, değişkenin ne olduğunu söylediğine değil, nesnenin gerçekte ne olduğuna bakar.
Bu, farklı nesnelerin tek tip bir şekilde işlenmesi gibi güçlü desenlere olanak tanır:
Animal[] pets = {new Dog(), new Cat(), new Dog()};
for (Animal pet : pets) {
pet.speak(); // Her biri kendi sürümünü çağırır
}Çalışma zamanı çok biçimliliği, doğru alt tür davranışını otomatik olarak kullanırken üst türlerle çalışan esnek kod yazmanızı sağlar.
Görev
KolayÇalışma zamanı polimorfizmini uygulamalı olarak gösteren bir bildirim sistemi oluşturalım. Gerçek nesne türüne bağlı olarak aynı yöntem çağrısının çalışma zamanında farklı çıktılar ürettiği bir bildirim türleri hiyerarşisi oluşturacaksın.
Kodunu dört dosyaya ayıracaksın:
Notification.java: Tüm bildirimlerin ortak kullandığı temel sınıfı oluştur. Her bildirimin birrecipientalanı (String) vardır. Bu alanı başlatmak için bir kurucu, bir getter yöntemi ve şu çıktıyı yazdıran birsend()yöntemi ekle:Sending notification to [recipient]EmailNotification.java: Notification sınıfını genişleten bir sınıf oluştur. E-posta bildirimleri birsubjectalanı ekler. Üst sınıfın başlatılması içinsuperkullan.send()yöntemini, şu çıktıyı yazdıracak şekilde geçersiz kıl:Emailing [recipient]: [subject]SMSNotification.java: Notification sınıfını genişleten başka bir sınıf oluştur. SMS bildirimleri birphoneNumberalanı ekler.send()yöntemini, şu çıktıyı yazdıracak şekilde geçersiz kıl:Texting [phoneNumber] for [recipient]Main.java: Çalışma zamanı polimorfizminin öne çıktığı yer burası! Üç girdi alacaksın: alıcının adı, bir e-posta konusu ve bir telefon numarası. Sırasıyla üç nesne (bir temel Notification, bir EmailNotification ve bir SMSNotification) içeren birNotificationreferansları dizisi oluştur; tümü aynı alıcıyı kullanmalı. Ardından dizi üzerinde döngü kur ve her öğe içinsend()çağrısı yap. Her nesnenin gerçekte ne olduğuna bağlı olarak Java'nın doğru geçersiz kılınmış sürümü otomatik olarak nasıl çağırdığına dikkat et!
Üç girdi alacaksın: alıcının adı (String), e-posta konusu (String) ve telefon numarası (String).
Çıktın üç satır göstermeli - aynı yöntemi Notification referansları üzerinde çağırmana rağmen her send() çağrısı farklı bir çıktı üretir. İşte dinamik yöntem dağıtımı böyle çalışır!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String recipient = scanner.nextLine();
String subject = scanner.nextLine();
String phoneNumber = scanner.nextLine();
// TODO: 3 öğeli bir Notification referans dizisi oluşturun
// Dizi şunları içermelidir (bu sırayla):
// 1. Temel bir Notification nesnesi
// 2. Bir EmailNotification nesnesi
// 3. Bir SMSNotification nesnesi
// Hepsi aynı alıcıyı (recipient) kullanmalı
// TODO: Dizi üzerinde döngü kurun ve her öğe için send() metodunu çağırın
// Bu, çalışma zamanı polimorfizmini (run-time polymorphism) gösterir!
}
}
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