Java Overloading ve Overriding Nedir? Aralarındaki Farklar
Java Overloading ve Overriding Nedir? Farkları ve Örnekleri
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.
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,privatevs. yapılabilir. - Exception Fırlatabilir (Opsiyonel): Farklı hata fırlatma (throws) durumları eklenebilir.
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
voidolan dönüş tipiniintyaparak 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.