Menu
Coddy logo textTech

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şturur

Geç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.

challenge icon

Görev

Kolay

Alt 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:
    • recipient e-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 @Override anotasyonunu kullanarak send() 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 birinde send() 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şturur

Geç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
    }
}
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