Java Overloading ve Overriding Nedir? Aralarındaki Farklar

İngilizce'ye Geç

Java Overloading ve Overriding Nedir? Farkları ve Örnekleri

Kısa Özet: Overloading ve Overriding Farkı Nedir?

Overloading (Aşırı Yükleme), aynı sınıf içinde aynı isme sahip fakat farklı parametreler alan metotlar tanımlamaktır ve karar derleme zamanında (Compile-time) verilir. Overriding (Üzerine Yazma) ise alt sınıfın, üst sınıftan miras aldığı bir metodu aynı isim ve aynı parametrelerle kendi ihtiyacına göre yeniden kodlamasıdır; karar çalışma zamanında (Runtime) nesnenin gerçek tipine göre verilir.

Nesne Yönelimli Programlama (OOP) dillerinde esnek ve okunabilir kod yazmanın en önemli kurallarından biri metotları doğru yönetmektir. Bu yazıda Java overloading ve overriding kavramlarını detaylı şekilde inceleyeceğiz. Aralarındaki farklar, kullanım kuralları ve örneklerle konuyu net bir şekilde anlayacaksınız.

İlgili İçerik: Overriding işleminin arka planındaki asıl sihir Polimorfizm'dir. Konuyu tam anlamıyla kavramak için Java Polimorfizm (Çok Biçimlilik) Nedir? ve Metot Dönüş Tipi Kuralları rehberlerimize mutlaka göz atın.

1. Overloading (Metot Aşırı Yükleme) Nedir?

Overloading, aynı sınıf içinde aynı isimli metotların farklı parametrelerle yeniden tanımlanmasıdır. Bu sayede aynı işi yapan ama farklı veri tipleri veya farklı sayıda argümanlarla çalışan metotlar yazılabilir. Bu durum kodun okunabilirliğini büyük ölçüde artırır.

public class Toplama {
    // 1. Metot: İki int toplar
    public int topla(int x, int y) {
        return x + y;
    }

    // 2. Metot (Overloaded): İki double toplar
    public double topla(double x, double y) {
        return x + y;
    }
}

2. Overloading Kuralları

  • Parametreler Mutlaka Değişmelidir (Zorunlu): Parametrelerin sayısı, sırası veya veri tipi farklı olmalıdır.
  • Dönüş Tipi Değişebilir (Opsiyonel): Parametre listesi değiştiği sürece dönüş tipi serbesttir.
  • Erişim Belirleyici Değişebilir (Opsiyonel): public, private vs. yapılabilir.
  • Exception Fırlatabilir (Opsiyonel): Farklı hata fırlatma (throws) durumları eklenebilir.
Önemli Kural: Sadece dönüş tipini değiştirerek overloading yapılamaz. Parametre (metot imzası) aynıysa Java derleme hatası verir.

3. Overloading Nasıl Çalışır? (Compile-time)

Derleyici (Compiler), hangi metodun çağrılacağına gönderdiğiniz parametrelerin tipine bakarak karar verir. Bu yüzden Overloading işlemine Compile-Time Polymorphism (Erken Bağlama / Static Binding) denir.

Toplama t = new Toplama();

int sonuc1 = t.topla(10, 5);      // Derleyici 1. metodu seçer
double sonuc2 = t.topla(2.5, 3.5); // Derleyici 2. metodu seçer

Referans Tiplerinde Overloading Tuzağı

class Hayvan { }
class At extends Hayvan { }

class Test {
    public void yemekYe(Hayvan h) { System.out.println("Hayvanlar yemek yer"); }
    public void yemekYe(At a) { System.out.println("Atlar ot yer"); }
}

// Kullanım:
Hayvan h = new At();
Test test = new Test();
test.yemekYe(h); // ÇIKTI: "Hayvanlar yemek yer"

Neden "Atlar ot yer" yazmadı? Çünkü Overloading kararını Derleyici verir ve derleyici sadece referansın tipine (Burada Hayvan h) bakar, bellekteki nesnenin ne olduğuyla ilgilenmez!

4. Overriding (Metot Üzerine Yazma) Nedir?

Overriding, alt sınıfın (Child), üst sınıftaki (Parent) bir metodu tamamen aynı isim ve aynı parametrelerle kendi ihtiyacına göre yeniden kodlamasıdır (ezmesi). Bu işlem Runtime (Çalışma Zamanı) sırasında belirlenir.

class Hayvan {
    public void yemek() {
        System.out.println("Hayvanlar yemek yer");
    }
}

class At extends Hayvan {
    @Override
    public void yemek() {
        System.out.println("Atlar ot yer");
    }
}

// Kullanım:
Hayvan h = new At();
h.yemek(); // ÇIKTI: "Atlar ot yer"

Overloading'in aksine, Overriding'de (Runtime Polymorphism) karar, JVM tarafından çalışırken fiziksel nesnenin tipine (Burada new At()) bakılarak verilir.

5. Overloading vs Overriding Karşılaştırması

Özellik Overloading (Aşırı Yükleme) Overriding (Üzerine Yazma)
Konum Aynı sınıf içinde gerçekleşir. Kalıtım olan iki sınıf (Super-Sub) arasında gerçekleşir.
Metot İmzası (Parametreler) Mutlaka değişmek zorundadır. Kesinlikle aynı kalmak zorundadır.
Karar Zamanı Compile-time (Derleme zamanı - Static Binding) Runtime (Çalışma zamanı - Dynamic Binding)
Dönüş Tipi (Return Type) Serbesttir, istenildiği gibi değiştirilebilir. Aynı kalmalı veya Covariant Return Type (Alt sınıfı) olmalıdır.

6. İkisinin Birlikte Kullanımı

Bir alt sınıf, üst sınıfın metodunu hem ezebilir (Override) hem de o metodu aynı sınıf içinde aşırı yükleyebilir (Overload).

class Hayvan {
    public void yemek() {
        System.out.println("Hayvanlar yemek yer");
    }
}

class At extends Hayvan {
    // 1. Üst Sınıftaki Metodu Ezmek (Overriding)
    @Override
    public void yemek() {
        System.out.println("Atlar ot yer");
    }

    // 2. Kendi Sınıfı İçinde Aşırı Yüklemek (Overloading)
    public void yemek(String yiyecek) {
        System.out.println("Atlar " + yiyecek + " yer");
    }
}

7. Sık Yapılan Hatalar

  • Dönüş Tipi Hatası: Parametreleri değiştirmeden, sadece void olan dönüş tipini int yaparak overload yapılabileceğini sanmak.
  • Static Metot Yanılgısı: Statik metotların override edilebileceğini düşünmek. (Statik metotlar ezilemez, sadece gizlenir - Method Hiding).
  • Referans Tipi Karmaşası: Compile-time ve Runtime bağlama farklarını bilmediği için, overloaded metotlara polimorfik referans gönderirken (Örn: Hayvan h = new At();) yanlış metodun çalışmasına şaşırmak.

8. Sık Sorulan Sorular (SSS)

Overloading (Aşırı Yükleme) nedir?

Aynı sınıf içerisinde aynı isme sahip ancak aldığı parametrelerin türü, sayısı veya sırası farklı olan birden fazla metot tanımlama işlemidir.

Overriding (Üzerine Yazma) nedir?

Alt sınıfın, kalıtım aldığı üst sınıftaki bir metodu, aynı isim ve aynı parametrelerle kendi ihtiyacına uyacak şekilde yeniden kodlamasıdır.

Overloading compile-time mı yoksa runtime mıdır?

Overloading işlemi kesinlikle compile-time'dır (Derleme zamanı). Derleyici, hangi metodun çalışacağını gönderilen parametrelere bakarak kod çalışmadan önce belirler.

Overriding runtime mıdır?

Evet, overriding runtime'dır (Çalışma zamanı). Java Sanal Makinesi (JVM), hangi metodun çalışacağına kod icra edilirken bellekteki gerçek nesne tipine bakarak o anda karar verir.

Sonuç

Java'da Overloading ve Overriding, OOP (Nesne Yönelimli Programlama) mantığını anlamanın ve Polimorfizmi başarılı bir şekilde uygulamanın en önemli parçalarından biridir. İkisi arasındaki temel farkın Compile-Time (Statik Bağlama) ve Runtime (Dinamik Bağlama) olduğunu net bir şekilde kavramak, kurumsal projelerde çok daha temiz, hatasız ve bakımı kolay kod yazmanızı sağlayacaktır.

Etiketler: java overloading, java overriding, java oop, polymorphism, compile-time polymorphism

Son Güncelleme: 2026

Latest Software Developers - Yazılım Blog Yazarı Profil Resmi

Yazar

LatestSoftwareDevelopers

Güncel yazılım teknolojilerinin takip edildiği blog.

Java ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *