Menu
Coddy logo textTech

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.

challenge icon

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 bir recipient alanı (String) vardır. Bu alanı başlatmak için bir kurucu, bir getter yöntemi ve şu çıktıyı yazdıran bir send() 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 bir subject alanı ekler. Üst sınıfın başlatılması için super kullan. 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 bir phoneNumber alanı 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 bir Notification referansları dizisi oluştur; tümü aynı alıcıyı kullanmalı. Ardından dizi üzerinde döngü kur ve her öğe için send() ç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!

GEREKLİ ÇIKTI BİÇİMİ: [Çevrilmiş içeriğin]

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!
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Java derleyicisi