Menu
Coddy logo textTech

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şebiliriz

Downcasting 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.

challenge icon

Görev

Kolay

Hem ü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 bir title alanı (String) vardır. Bu alanı başlatmak için bir kurucu, getTitle() getter metodu ve şu çıktıyı yazdıran bir play() metodu ekle: Playing: [title]
  • Song.java: Media sınıfını genişleten bir sınıf oluştur. Şarkıların ek olarak bir artist alanı (String) vardır. Üst sınıfın başlatılması için super kullan. play() metodunu şu çıktıyı yazdıracak şekilde geçersiz kıl: Playing song: [title] by [artist]. Şu çıktıyı yazdıran bir showArtist() metodu ekle: Artist: [artist]
  • Podcast.java: Media sınıfını genişleten başka bir sınıf oluştur. Podcast'lerin bir episode alanı (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 bir showEpisode() 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
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Java derleyicisi