Metot Aşırı Yükleme Temelleri
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 28 / 87.
Polimorfizm "çok biçimlilik" anlamına gelir. Java'da, nesnelerin bağlama göre farklı davranmasına olanak tanır. Polimorfizmin bir biçimi, Java'nın hangi metodun çağrılacağını derleme sırasında belirlemesi nedeniyle derleme zamanı polimorfizmi olarak da adlandırılan metot aşırı yüklemedir (method overloading).
Metot aşırı yükleme (method overloading), aynı isme fakat farklı parametrelere sahip birden fazla metot tanımlamanıza olanak tanır. Derleyici, parametrelerin sayısına, türüne veya sırasına göre bunlar arasında ayrım yapar:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public double add(double a, double b) {
return a + b;
}
}add(5, 3) metodunu çağırdığınızda, Java ilk metodu kullanır. add(5, 3, 2) metodunu çağırmak ikincisini tetikler ve add(5.0, 3.0) üçüncüsünü çağırır. Derleyici, sağladığınız argümanlara göre doğru sürümü seçer.
Yalnızca dönüş türünü değiştirmenin geçerli bir aşırı yükleme (overloading) olmadığını unutmayın. Parametre listesi farklı olmalıdır:
// Geçerli bir aşırı yükleme DEĞİLDİR - derlenmeyecektir
public int getValue() { return 1; }
public double getValue() { return 1.0; } // Hata!Aslında aşırı yüklemeyi (overloading) daha önce yapıcı (constructor) aşırı yüklemesi ile görmüştünüz. Metot aşırı yüklemesi aynı kuralları izler ve tek bir metot adının farklı girdi senaryolarını işlemesine izin vererek esneklik sağlar.
Görev
KolayMesajları biçimlendirmek için birden fazla yol sunarak metot aşırı yüklemesini (method overloading) gösteren bir mesaj biçimlendirici oluşturalım. Farklı girdi senaryolarını işleyen birkaç aşırı yüklenmiş format metoduna sahip bir yardımcı sınıf oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
MessageFormatter.java: Aşırı yüklenmiş metotlar aracılığıyla esnek mesaj biçimlendirme sağlayan bir sınıf oluşturun. Biçimlendiriciniz şunlara sahip olmalıdır:- Mesajı köşeli parantez içine alarak döndüren bir
format(String message)metodu:[message] - Mesajı, aralarında boşluk bırakarak belirtilen sayıda tekrarlayan bir
format(String message, int repeatCount)metodu - Mesajı başına bir önek ekleyerek döndüren bir
format(String message, String prefix)metodu:prefix: message - Şu formatta döndüren bir
format(String message, String prefix, String suffix)metodu:prefix: message (suffix)
- Mesajı köşeli parantez içine alarak döndüren bir
Main.java: Dört aşırı yüklenmiş metodun da birlikte çalıştığını gösterin. Dört girdi alacaksınız: bir mesaj (String), bir tekrar sayısı (int), bir önek (String) ve bir sonek (String). Bir MessageFormatter oluşturun veformatmetodunun her bir versiyonunu çağırarak her sonucu kendi satırında yazdırın:- İlk olarak, sadece mesaj ile biçimlendirin
- İkinci olarak, mesaj ve tekrar sayısı ile biçimlendirin
- Üçüncü olarak, mesaj ve önek ile biçimlendirin
- Dördüncü olarak, mesaj, önek ve sonek ile biçimlendirin
Dört girdi alacaksınız: mesaj metni, kaç kez tekrarlanacağı, bir önek dizesi ve bir sonek dizesi.
Örneğin, mesaj "Hello", tekrar sayısı 3, önek "INFO" ve sonek "done" ise, çıktınız aynı mesajın her biri farklı bir aşırı yüklenmiş metot kullanan dört farklı biçimlendirilmiş versiyonunu göstermelidir!
Kopya kağıdı
Metot aşırı yükleme (Method overloading), aynı isme sahip ancak farklı parametrelere sahip birden fazla metot tanımlamanıza olanak tanır. Java, hangi metodun çağrılacağını derleme sırasında belirlediği için buna derleme zamanı polimorfizmi de denir.
Derleyici, aşırı yüklenmiş metotları parametrelerin sayısına, türüne veya sırasına göre ayırt eder:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public double add(double a, double b) {
return a + b;
}
}add(5, 3) çağrıldığında Java ilk metodu kullanır. add(5, 3, 2) çağrısı ikinciyi tetikler ve add(5.0, 3.0) üçüncüyü çağırır.
Önemli: Sadece dönüş türünü değiştirmek geçerli bir aşırı yükleme değildir. Parametre listesi farklı olmalıdır:
// Geçerli bir aşırı yükleme DEĞİLDİR
public int getValue() { return 1; }
public double getValue() { return 1.0; } // Hata!Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String message = scanner.nextLine();
int repeatCount = Integer.parseInt(scanner.nextLine());
String prefix = scanner.nextLine();
String suffix = scanner.nextLine();
// TODO: Bir MessageFormatter nesnesi oluşturun
// TODO: format metodunu sadece message ile çağırın ve sonucu yazdırın
// TODO: format metodunu message ve repeatCount ile çağırın ve sonucu yazdırın
// TODO: format metodunu message ve prefix ile çağırın ve sonucu yazdırın
// TODO: format metodunu message, prefix ve suffix ile çağırın ve sonucu yazdırın
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı