Yöntem aşırı yüklenmesi (method overloading), aynı isimde ancak farklı parametrelerle (tip, sıra, miktar) bir sınıfta birden fazla yöntem oluşturma yeteneğidir. Bu yaklaşım benzer işlemleri mantıksal olarak birleştirmeye ve kodun okunabilirliğini artırmaya yardımcı olur.
public class MathUtil { public int sum(int a, int b) { return a + b; } public double sum(double a, double b) { return a + b; } public int sum(int a, int b, int c) { return a + b + c; } }
Soru: Yöntemleri sadece dönüş türü ile (parametreleri değiştirmeden) aşırı yükleyebilir miyiz?
Cevap: Hayır. Aşırı yükleme sadece parametre listesindeki farklılık durumunda mümkündür. Sadece dönüş türündeki fark, derleme hatasına yol açar.
void foo(int a) {} int foo(int a) { return 1; } // Hata! Dönüş türü aşırı yüklemede dikkate alınmaz.
Hikaye
Bir projede geliştirici iki yöntem oluşturdu:
public void process(int x, double y) {...} public void process(double x, int y) {...}
process(5, 10)çağrıldığında, derleyici doğru versiyonu seçemediği için çağrıda belirsizlik hatasına yol açıyordu. Bu durum modülün teslimini geciktirdi.
Hikaye
Uygulamada aşırı yükleme yapan varargs ve dizilerle ilgili yöntemler:
public void log(String... messages) {...} public void log(String[] messages) {...}
String[] datadizisinin iletimi her zaman beklenen aşırı yüklemeyi çağırmadı ve bu nedenle bazı veriler yanlış kaydedildi — bazı bilgiler kayboldu! Dizi ile varargs arasındaki fark kritik oldu.
Hikaye
Geliştirici, türlerin otomatik kutulanmasını (autoboxing) dikkate almadan sınıfın yöntemlerini aşırı yükledi:
public void save(Integer i) {...} public void save(int i) {...}
save(null)çağrıldığında, primitive int üzerinde çağrıda NullPointerException oluştu, çünkü Java en spesifik türü (int) seçiyor ama null, primitive olarak dönüştürülemez!