Dahili, Yuvalanmış ve Anonim Sınıflar
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 49 / 87.
Java, sınıfları diğer sınıfların içinde tanımlamanıza olanak tanır. Bu iç sınıflar, ilgili işlevleri bir arada gruplayarak kodu düzenlemeye yardımcı olur ve dış sınıfın üyelerine doğrudan erişebilir.
İç içe geçmiş bir iç sınıf, başka bir sınıfın üyesi olarak tanımlanır. Dış sınıfın, özel olanlar da dâhil olmak üzere tüm alanlarına ve yöntemlerine erişebilir:
class Outer {
private String message = "Hello";
class Inner {
void display() {
System.out.println(message); // Özel (private) alana erişebilir
}
}
}
// Kullanım
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display(); // Çıktı: HelloYerel iç sınıf bir metodun içinde tanımlanır. Yalnızca o metodun içinde kullanılabilir ve etkin olarak final olan yerel değişkenlere erişebilir:
void process() {
String prefix = "Result: ";
class LocalHelper {
void print(int value) {
System.out.println(prefix + value);
}
}
new LocalHelper().print(42);
}Anonim bir iç sınıf, adı olmayan, tek bir ifadede oluşturulup örneği oluşturulan bir sınıftır. Genellikle arayüzleri uygulamak veya sınıfları anında genişletmek için kullanılır:
Comparator<String> comp = new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.length() - b.length();
}
};Dahili sınıflar, bir sınıfın yalnızca başka bir sınıfla ilgili olduğu durumlarda özellikle yararlıdır; bu da kodunuzun düzenli ve kapsüllenmiş kalmasını sağlar.
Görev
KolayÜç tür iç sınıfın tümünü sergileyen bir alışveriş sepeti sistemi oluşturalım. Öğeleri temsil etmek için iç içe bir sınıf, indirimleri hesaplamak için yerel bir iç sınıf ve son makbuzu biçimlendirmek için anonim bir iç sınıf kullanan bir ShoppingCart oluşturacaksın.
Kodunu iki dosyaya ayıracaksın:
ShoppingCart.java: Alışveriş deneyimini yöneten dış sınıfı oluştur. ShoppingCart sınıfında özel bircustomerNamealanı (String) bulunmalı.ShoppingCart içinde, iki özel alana sahip iç içe bir iç sınıf olan
Itemsınıfını tanımla:name(String) veprice(double). Item sınıfına her iki alanı başlatan bir kurucu ve şu değeri döndüren birgetDetails()yöntemi ekle:[name]: $[price]ShoppingCart sınıfının müşteri adını alan bir kurucuya ve bir Item ile indirim yüzdesini (double) kabul eden
checkout()adlı bir yönteme ihtiyacı var.checkout()içinde:DiscountCalculatoradlı bir yönteme sahip yerel bir iç sınıf olanapplyDiscount(double originalPrice)oluştur. Bu yöntem, indirim yüzdesi uygulandıktan sonraki fiyatı döndürmeli.- Son fiyatı hesaplamak için yerel sınıfı kullan.
- Makbuzu biçimlendirmek için
Formatterarayüzünü uygulayan (bu arayüzü sen tanımlayacaksın) bir anonim iç sınıf oluştur. Anonim sınıf, birden fazla satırdan oluşan makbuz dizesini döndüren birformat()yöntemini geçersiz kılmalı.
checkout()yöntemi, biçimlendirilmiş makbuz dizesini tam olarak şu biçimde döndürmeli:--- Receipt --- Customer: [customerName] Item: [item details from getDetails()] Discount: [discount]% Final Price: $[calculated price]Formatter.java: Tek bir yönteme sahip basit bir arayüz tanımla:String format(). Bu arayüz, checkout yöntemi içindeki anonim iç sınıf tarafından uygulanacak.Main.java: Alışveriş sepetine hayat ver! Üç girdi alacaksın: müşteri adı (String), ürün adı (String) ve ürün fiyatı (double). İndirim yüzdesi10.0olarak sabittir.Müşteri adıyla bir ShoppingCart oluştur. Ardından dış sınıf başvuru söz dizimini kullanarak bir Item oluştur:
cart.new Item(name, price).checkout()yöntemini öğe ve indirimle çağır ve döndürülen makbuzu yazdır.
Üç girdiyi şu sırayla alacaksın: müşteri adı, ürün adı ve ürün fiyatı.
Örneğin girdiler Alice, Laptop ve 1000.0 ise, %10 indirimden sonraki son fiyat 900.0 olur.
Her iç sınıf türünün farklı bir amaca hizmet ettiğine dikkat et: iç içe sınıf, ilgili verileri dış sınıfla gruplandırır; yerel sınıf, yalnızca tek bir yöntem içinde gereken mantığı kapsüller; anonim sınıf ise bir arayüzün hızlı ve tek seferlik bir uygulamasını sağlar!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String customerName = scanner.nextLine();
String itemName = scanner.nextLine();
double itemPrice = scanner.nextDouble();
double discount = 10.0;
// TODO: Müşteri adıyla bir ShoppingCart oluşturun
// TODO: cart.new Item(itemName, itemPrice) kullanarak bir Item oluşturun
// TODO: item ve discount ile checkout() metodunu çağırın, ardından 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ıKendi başına pratik yap: Online Java derleyicisi