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 (Inheritance) bölümünde metot geçersiz kılma (method overriding) konusunu öğrendiniz. Bunu polimorfik yapan şey, bir üst sınıf referansı bir alt sınıf nesnesine işaret ettiğ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 (parent-type) referansları kullandığımızda neler olduğunu inceleyin:

Animal myPet = new Dog();
myPet.speak();  // Çıktı: Bark!

myPet = new Cat();
myPet.speak();  // Çıktı: Meow!

Her ne kadar myPet, Animal olarak bildirilmiş olsa da, Java çalışma zamanındaki gerçek nesne türüne dayanarak geçersiz kılınan (overridden) metodu çağırır. Buna dinamik metot gönderimi (dynamic method dispatch) denir. JVM, değişkenin ne dediğ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 (Run-time polymorphism), otomatik olarak doğru alt sınıf davranışını kullanırken, üst türlerle çalışan esnek kodlar yazmanıza olanak tanır.

challenge icon

Görev

Kolay

Çalışma zamanı polimorfizmini (run-time polymorphism) iş başında gösteren bir bildirim sistemi kuralım. Aynı metot çağrısının, çalışma zamanındaki gerçek nesne türüne bağlı olarak farklı çıktılar ürettiği bir bildirim türleri hiyerarşisi oluşturacaksınız.

Kodunuzu dört dosya halinde düzenleyeceksiniz:

  • Notification.java: Tüm bildirimlerin paylaştığı temel sınıfı oluşturun. Her bildirimin bir recipient alanı (String) vardır. Bunu başlatmak için bir yapıcı (constructor), bir getter metodu ve şu çıktıyı veren bir send() metodu ekleyin: Sending notification to [recipient]
  • EmailNotification.java: Notification sınıfını genişleten bir sınıf oluşturun. E-posta bildirimleri bir subject alanı ekler. Üst sınıf başlatması için super kullanın. send() metodunu şu çıktıyı verecek şekilde geçersiz kılın (override): Emailing [recipient]: [subject]
  • SMSNotification.java: Notification sınıfını genişleten başka bir sınıf oluşturun. SMS bildirimleri bir phoneNumber alanı ekler. send() metodunu şu çıktıyı verecek şekilde geçersiz kılın: Texting [phoneNumber] for [recipient]
  • Main.java: İşte çalışma zamanı polimorfizminin parladığı yer burası! Üç girdi alacaksınız: bir alıcı adı, bir e-posta konusu ve bir telefon numarası. Şu sırayla üç nesne içeren bir Notification referans dizisi oluşturun: bir temel Notification, bir EmailNotification ve bir SMSNotification (hepsi aynı alıcıyı kullanarak). Ardından dizi boyunca döngü kurun ve her öğe üzerinde send() metodunu çağırın. Java'nın, her nesnenin gerçekte ne olduğuna bağlı olarak doğru geçersiz kılınmış sürümü otomatik olarak nasıl çağırdığını izleyin!

Üç girdi alacaksınız: alıcı adı (String), e-posta konusu (String) ve telefon numarası (String).

Çıktınız üç satır göstermelidir - Notification referansları üzerinde aynı metodu çağırmanıza rağmen her send() çağrısı farklı çıktı üretir. İşte bu, dinamik metot atamasının (dynamic method dispatch) iş başındaki halidir!

Kopya kağıdı

Metot geçersiz kılma (method overriding), Java'nın program çalışırken değişkenin bildirilen türü yerine nesnenin gerçek türüne dayanarak hangi metodun yürütüleceğine karar verdiği çalışma zamanı polimorfizmini (run-time polymorphism) gösterir.

Bir üst sınıf (parent) referansı bir alt sınıf (child) nesnesine işaret ettiğinde, Java çalışma zamanında gerçek nesne türüne bağlı olarak geçersiz kılınan metodu çağırı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!");
    }
}

Animal myPet = new Dog();
myPet.speak();  // Output: Bark!

myPet = new Cat();
myPet.speak();  // Output: Meow!

Buna dinamik metot sevki (dynamic method dispatch) denir. JVM, değişkenin ne dediğine değil, nesnenin gerçekte ne olduğuna bakar.

Çalışma zamanı polimorfizmi, farklı nesnelerin tek tipte işlenmesini sağlar:

Animal[] pets = {new Dog(), new Cat(), new Dog()};
for (Animal pet : pets) {
    pet.speak();  // Each calls its own version
}

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