Upcasting ve Downcasting
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 30 / 87.
Önceki derste, üst türdeki bir değişkenin alt türdeki bir nesneyi tutabildiğini gördünüz: Animal myPet = new Dog(). Bu atamaya upcasting denir ve bir Dog her zaman bir Animal olduğu için otomatik olarak gerçekleşir.
Upcasting kalıtım hiyerarşisinde yukarı doğru hareket eder. Örtüktür ve her zaman güvenlidir:
Dog dog = new Dog();
Animal animal = dog; // Upcasting - otomatikÜst türe dönüştürdüğünüzde yalnızca üst sınıfta tanımlanan yöntemlere erişebilirsiniz. Nesne temelde hâlâ bir Dog olsa da çocuğa özgü yöntemler gizlenir.
Aşağı tür dönüşümü, üst sınıf başvurusunu alt türüne geri dönüştürerek zıt yönde ilerler. Bu, her zaman güvenli olmadığı için açık bir tür dönüşümü gerektirir:
Animal animal = new Dog(); // Yukarı dönüştürme
Dog dog = (Dog) animal; // Aşağı dönüştürme - açık cast gerekli
dog.bark(); // Artık Dog metodlarına erişebilirizDowncasting risklidir. Nesne, dönüştürmeye çalıştığınız türde değilse Java çalışma zamanında bir ClassCastException fırlatır:
Animal animal = new Cat();
Dog dog = (Dog) animal; // Derlenir, ama çalışma zamanında çöker!Derleyici bu hatayı yakalayamaz, çünkü yalnızca bildirilen türleri görür. Gerçek nesne türü ancak program çalıştığında bilinir. Sonraki derste, downcast işlemi yapmadan önce bir nesnenin türünü güvenli bir şekilde nasıl kontrol edeceğini öğreneceksin.
Görev
KolayHem üst tür dönüşümünü hem de alt tür dönüşümünü uygulamalı olarak gösteren bir medya oynatıcı sistemi oluşturalım. Bir medya türleri hiyerarşisi oluşturacak ve üst sınıf ile alt sınıf referansları arasında dönüşüm yapmayı uygulayacaksın.
Kodunu dört dosyaya ayıracaksın:
Media.java: Tüm medya türlerinin ortak kullanacağı temel sınıfı oluştur. Her medya öğesinin birtitlealanı (String) vardır. Bu alanı başlatmak için bir kurucu,getTitle()getter metodu ve şu çıktıyı yazdıran birplay()metodu ekle:Playing: [title]Song.java: Media sınıfını genişleten bir sınıf oluştur. Şarkıların ek olarak birartistalanı (String) vardır. Üst sınıfın başlatılması içinsuperkullan.play()metodunu şu çıktıyı yazdıracak şekilde geçersiz kıl:Playing song: [title] by [artist]. Şu çıktıyı yazdıran birshowArtist()metodu ekle:Artist: [artist]Podcast.java: Media sınıfını genişleten başka bir sınıf oluştur. Podcast'lerin birepisodealanı (int) vardır.play()metodunu şu çıktıyı yazdıracak şekilde geçersiz kıl:Playing podcast: [title] - Episode [episode]. Şu çıktıyı yazdıran birshowEpisode()metodu ekle:Episode: [episode]Main.java: Medya türlerinle üst tür dönüşümünü ve alt tür dönüşümünü göster. Dört girdi alacaksın: bir şarkı başlığı, bir sanatçı adı, bir podcast başlığı ve bir bölüm numarası.İlk olarak bir Song oluştur ve bunu bir Media referansına üst tür dönüşümüyle dönüştür. Çalışma zamanı çok biçimliliğini görmek için bu referans üzerinde
play()metodunu çağır.Ardından bu Media referansını tekrar bir Song türüne alt tür dönüşümüyle dönüştür ve alt sınıfa özgü metoda erişmek için
showArtist()metodunu çağır.Sonra bir Podcast oluştur ve bunu bir Media referansına üst tür dönüşümüyle dönüştür. Bu referans üzerinde
play()metodunu çağır.Son olarak bu Media referansını tekrar bir Podcast türüne alt tür dönüşümüyle dönüştür ve
showEpisode()metodunu çağır.
Dört girdi alacaksın: şarkı başlığı (String), sanatçı adı (String), podcast başlığı (String) ve bölüm numarası (int).
Çıktın dört satır göstermeli: şarkı için iki satır (oynatma çıktısı ve sanatçı bilgisi) ve podcast için iki satır (oynatma çıktısı ve bölüm bilgisi). Üst tür dönüşümünün farklı medya türlerini tek biçimde ele almanı sağlarken alt tür dönüşümünün onların kendine özgü özelliklerine erişmeni sağladığına dikkat et!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String songTitle = scanner.nextLine();
String artistName = scanner.nextLine();
String podcastTitle = scanner.nextLine();
int episodeNumber = scanner.nextInt();
// TODO: Bir Song oluştur ve bir Media referansına upcast et
// TODO: Media referansı üzerinde play() çağır (polimorfizmi gösterir)
// TODO: Media referansını tekrar Song'a downcast et
// TODO: Song referansı üzerinde showArtist() çağır
// TODO: Bir Podcast oluştur ve bir Media referansına upcast et
// TODO: Media referansı üzerinde play() çağır
// TODO: Media referansını tekrar Podcast'e downcast et
// TODO: Podcast referansı üzerinde showEpisode() çağır
}
}
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