# Java Overloading vs Overriding

<figure><img src="https://10693534-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FpHJ8OuTO6xpfwqkn7vmg%2Fuploads%2Fgit-blob-e2053d50c4e7e70b6d6bd6674395a99eee6af5fe%2Fjava1.png?alt=media" alt=""><figcaption></figcaption></figure>

## 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.

```java
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.

```java
// 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

```java
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.                           |

{% embed url="<https://github.com/MKLKCDG>" fullWidth="false" %}
Bu yazı Mikail KOCADAĞ tarafından hazırlanmıştır.
{% endembed %}
