Bir class, aynı anda ve aynı isimde birden fazla metot barındırabilir. Bu duruma aşırı yükleme (Method Overloading) denir. Aynı isimdeki bu metotların parametre türleri farklı veya parametre sayıları farklı olmak durumundadır.
Compiler (derleyici), metotların birbirinin aynısı (duplucate) olup olmadığını anlamak için metot imzasını (method signature) kontrol eder. Bu kontrol 3 ana başlıktan oluşur.
- Metot adı.
- Parametre sayısı.
- Parametre tipi.
Eğer yukarıdaki 3 durum da aynı ise compiler, “duplicate method error” hatası oluşturur.
Compiler ilk olarak metot adını kontrol edecek. Eğer isimler aynı ise parametre sayısını kontrol edecek, parametre sayısı farklı ise aşırı yüklenmiş metot olarak algılayacak ve parametre tipi kontrolünü yapmayacaktır. Parametre sayıları da aynı ise o zaman parametre tipine bakacak, parametre tipleri aynı ise hata oluşacak, farklı ise aşırı yüklenmiş metot olarak algılanacaktır.
Bir metodun aşırı yüklenmesi için isimlerinin aynı olması gerekmektedir. İsimler aynı olmasının yanında, parametre sayıları veya tipleri farklı olmalıdır. İsimler farklı ise, bunlar farklı metotlar olarak yorumlanır.
Aşağıdaki örneği ve yorum satırlarını inceleyelim.
public class MethodOverloading {
void methodOverloaded() {
//Parametresiz metot
}
void methodOverloaded(int i) {
//Bir parametreli - Doğru
}
void methodOverloaded(double d) {
//Bir parametreli ancak parametre tipi farklı - Doğru
}
void methodOverloaded(int i, double d) {
//İki parametreli - Doğru
}
void methodOverloaded(double d, int i) {
//İki parametreli fakat yukarıdaki iki parametreli methodOverloaded(int, double) imzalı metotdan parametre tipleri farklı - Doğru
}
void methodOverloaded(double d1, int i1) {
//İki parametreli fakat yukarıdaki iki parametreli methodOverloaded(double, int) imzalı metod ile parametre sayıları ve parametre tipleri aynıdır. - Yanlış
}
void differentMethod() {
//Farklı metot
}
}
Aşırı yüklenmiş metotlar farklı geri dönüş tiplerine sahip olabilirler. Ancak yukarıda anlatılan compiler’ın kontrol ettiği 3 ana madde hala geçerlidir. Yani farklı geri dönüş değerleri olsada parametre sayıları ve tipleri aynı ise duplicate method hatası oluşur.
public class MethodOverloading {
void methodOverloaded() {
//parametresiz metot, geri dönüş değeri void
}
int methodOverloaded(int i) {
//geri dönüş değeri int
return i;
}
int methodOverloaded(double d) {
//aynı geri dönüş değerine sahip ancak parametre tipi farklı
return 0;
}
void methodOverloaded(double d) {
//Duplicate Method, geri dönüş değeri farklı ancak parametre sayısı ve ve parametre tipi aynı olduğu için hatalı
// geri dönüş değeri metot overloaded metodlarda önem arz etmez.
}
}
Aşırı yüklenmiş metotlarda erişim düzenleyicilerin (Access modifiers) bir etkisi yoktur. Aynı erişim düzenleyiciye veya farklı erişim düzenleyiciye sahip olabilirler. Unutmamak gerekir ki, yukarıda belirttiğimiz 3 başlık dışında bir şey metot aşırı yükleme (method overloading) işlemlerine etki etmez.
public class MethodOverloading {
private void methodOverloaded() {
//Parametre yok, private metot
}
private int methodOverloaded(int i) {
//Bir parametre, private metot
return i;
}
protected int methodOverloaded(double d) {
//Protected metot
return 0;
}
public void methodOverloaded(int i, double d) {
//Public metot
}
}
Metotların statik olup olmaması, metot aşırı yüklemeye etki etmez.
public class MethodOverloading {
private static void methodOverloaded() {
//Parametre yok, private static metot
}
private int methodOverloaded(int i) {
//Bir parametre, private statik olmayan metot
return i;
}
static int methodOverloaded(double d) {
//static Metot
return 0;
}
public void methodOverloaded(int i, double d) {
//Public statik olmayan metot
}
}
Konu basit, ancak anlaşılması çok önemlidir. Aklınızda kalan sorular olursa, yorum yaparak lütfen iletişime geçiniz.
2 Yorum
[…] method overloading terimi ile karıştırılan Method Overriding işlemlerinden bahsedeceğim. Method Overloading (Metotların Aşırı Yüklenmesi) makalesini okumadıysanız, lütfen öncelikli olarak bunu okuyunuz. Ayrıca makale içinde […]
[…] Bu konu, Inheritance (Kalıtım) ve Overloading(Aşırı Yükleme) konuları ile ilişkili olduğu için, yeri geldiğinde bu konulara atıfta bulunulacaktır. […]