Java Overloading vs Overriding

Overloading

Overloading(Yöntem Aşırı Yüklemesi), birden fazla method aynı method adını farklı bir imzayla(İmza metotların kendine has özellikleri bulunur ve bu özellikler Metot İmzası olarak adlandırılır.) class da paylaşır. Overloading'in, dönüş tipi aynı olabilir veya olmayabilir, ancak parametreyi değiştirmemiz gerekir çünkü Java'da yalnızca method dönüş tipini değiştirerek method overloading gibi birşey yoktur.

public class Main {
    public static class OverloadingExample {
        // Tek parametreli overloading yöntem
        public void display(int a) {
            System.out.println(a);
        }

        // İki parametreli overloading yöntem
        public void display(int a, int b) {
            System.out.println(a + " ve " + b);
        }

        // Farklı parametre tipine sahip overloading yöntem
        public void display(String a) {
            System.out.println(a);
        }

        public void main(String[] args) {
            OverloadingExample obj = new OverloadingExample();
            obj.display(10);         // İlk yöntemi çağırır: display(int a)
            obj.display(10, 20);     // İkinci yöntemi çağırır: display(int a, int b)
            obj.display("Hello");    // Üçüncü yöntemi çağırır: display(String a)
        }
    }
}

Örnekteki kodun çıktısı şu şekilde; 10 10 and 20 Hello

Bu örnekte display() yöntemi birden çok kez farklı imzalar kullanılarak tanımlanmıştır. Overloading (Aşırı yükleme) bize bir methodu kullanırken farklı parametrelerle kullanma imkanı sağlar. Bu sayede, aynı işlemi yapacak farklı parametre kombinasyonlarına sahip birden çok method tanımlamamıza gerek kalmaz.

Overriding

Overriding (Yöntem Geçersiz Kılma), bir sınıfın başka bir sınıftan miras aldığı metodları kendi içerisinde yeniden tanımlayarak kullanmasıdır. Daha anlaşılır bir şekilde ifade etmek gerekirse, bir sınıfın metodlarını başka bir sınıf aynı isimle tanımlayabilir ve kendi ihtiyaçları doğrultusunda yeniden oluşturabilir. Overriding, dönüş tipi aynı olmalı veya türetilmiş sınıfla aynı yönde değişebilir olmalıdır.

// Animal sınıfı
class Animal {
    // makeSound yöntemi
    public void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

// Dog sınıfı, Animal sınıfından miras alır
class Dog extends Animal {
    // makeSound yöntemini geçersiz kılar
    @Override
    public void makeSound() {
        System.out.println("The dog barks");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();  // Animal nesnesi oluşturur
        Animal myDog = new Dog();        // Dog nesnesi oluşturur ve Animal olarak işler

        myAnimal.makeSound(); // The animal makes a sound
        myDog.makeSound();    // The dog barks
    }
}

Örnekteki kodun çıktısı şu şekilde; The animal makes a sound The dog barks

Bu örnekte Dog classı makeSound() methodunu rverrid ederek Dog classı içinde yeniden tanımlamıştır. İki class da da aynı isimde method olmasına rağmen ikisi de birbirinden bağımsız çıktılar vermişlerdir.

Overloading vs Overriding

class Animal {
    public void makeSound() {
        System.out.println("The animal makes a sound");
    }

    public void makeSound(String sound) {
        System.out.println("The animal makes a sound: " + sound);
    }
}
class Dog extends Animal {
    // overridden
    @Override
    public void makeSound() {
        System.out.println("The dog barks");
    }

    // overloaded
    public void makeSound(int barkCount) {
        System.out.println("The dog barks " + barkCount + " times");
    }
}
public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Dog myDog = new Dog();
        myAnimal.makeSound();
        myAnimal.makeSound("meow");
        myDog.makeSound();
        myDog.makeSound(3);
        myDog.makeSound("loud bark");
    }
}

Bu örnekte hem overloading overriding bir arada görmekteyiz aradaki söz dizimi farkı açıkca gözükmekte. Overloading de, aynı method makeSound() farklı parametrelerle çağırılmışken, overriding ise aynı method makeSound() farklı classın içinde tekrar tanımlanmıştır.

Java'da Method Overloading ve Method Overriding arasındaki farkları şu tablo şeklinde gösterecek olursak

Method Overloading (Aşırı Yükleme)
Method Overriding (Geçersiz Kılma)

Method overloading derleme zamanı çok biçimliliğidir (compile-time polymorphism).

Method overriding çalışma zamanı çok biçimliliğidir (run-time polymorphism).

Method overloading, programın okunabilirliğini artırmaya yardımcı olur.

Method overriding, temel sınıf veya ebeveyn sınıf tarafından sağlanan yöntemin belirli bir uygulamasını sağlamak için kullanılır.

Sınıf içinde gerçekleşir.

Kalıtım ilişkileri olan iki sınıfta gerçekleştirilir.

Method overloading, kalıtım gerektirebilir veya gerektirmeyebilir.

Method overriding her zaman kalıtım gerektirir.

Method overloading'de, yöntemler aynı isme ve farklı imzalara sahip olmalıdır.

Method overriding'de, yöntemler aynı isme ve aynı imzaya sahip olmalıdır.

Method overloading'de, dönüş tipi aynı olabilir veya olmayabilir, ancak parametreyi değiştirmemiz yeterlidir.

Method overriding'de, dönüş tipi aynı veya co-variant olmalıdır.

Statik bağlama (static binding) aşırı yüklenmiş yöntemler için kullanılır.

Dinamik bağlama (dynamic binding) geçersiz kılınan yöntemler için kullanılır.

Derleme zamanı çok biçimliliğinden dolayı düşük performans sağlar.

Daha iyi performans sağlar. Bunun nedeni, geçersiz kılınan yöntemlerin çalışma zamanında bağlanmasıdır.

Bu yazı Mikail KOCADAĞ tarafından hazırlanmıştır.

Last updated

Was this helpful?