Upcasting dan downcasting
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 30 dari 87.
Di pelajaran sebelumnya, kamu melihat bagaimana variabel bertipe induk dapat menyimpan object turunan: Animal myPet = new Dog(). Penugasan ini disebut upcasting, dan terjadi secara otomatis karena Dog selalu merupakan Animal.
Upcasting bergerak naik dalam hierarki pewarisan. Proses ini dilakukan secara implisit dan selalu aman:
Dog dog = new Dog();
Animal animal = dog; // Upcasting terjadi secara otomatisSaat kamu melakukan upcast, kamu hanya dapat mengakses method yang didefinisikan di class induk. Method khusus untuk child menjadi tersembunyi, meskipun object tersebut tetap merupakan Dog.
Downcasting bergerak ke arah sebaliknya, mengubah referensi induk kembali menjadi tipe anak. Ini memerlukan cast eksplisit karena cara ini tidak selalu aman:
Animal animal = new Dog(); // Konversi ke tipe induk
Dog dog = (Dog) animal; // Konversi ke tipe turunan: perlu cast eksplisit
dog.bark(); // Sekarang kamu bisa mengakses method DogDowncasting berisiko. Jika object tersebut sebenarnya bukan tipe yang kamu gunakan untuk melakukan casting, Java akan melempar ClassCastException saat runtime:
Animal animal = new Cat();
Dog dog = (Dog) animal; // Berhasil di-compile, tetapi programmu mengalami crash saat dijalankan!Compiler tidak dapat mendeteksi error ini karena hanya melihat tipe yang dideklarasikan. Tipe object sebenarnya baru diketahui saat program dijalankan. Di pelajaran berikutnya, kamu akan belajar cara memeriksa tipe object dengan aman sebelum melakukan downcasting.
Tantangan
MudahMari buat sistem pemutar media yang menunjukkan cara kerja upcasting dan downcasting. Kamu akan membuat hierarki tipe media dan berlatih mengonversi referensi induk dan anak.
Kamu akan menyusun kodemu dalam empat file:
Media.java: Buat class dasar yang digunakan bersama oleh semua tipe media. Setiap item media memiliki fieldtitle(String). Sertakan constructor untuk menginisialisasi field tersebut, method gettergetTitle(), dan methodplay()yang mencetak:Playing: [title]Song.java: Buat class yang mewarisi Media. Lagu memiliki field tambahanartist(String). Gunakansuperuntuk inisialisasi induk. Overrideplay()agar mencetak:Playing song: [title] by [artist]. Tambahkan methodshowArtist()yang mencetak:Artist: [artist]Podcast.java: Buat class lain yang mewarisi Media. Podcast memiliki fieldepisode(int). Overrideplay()agar mencetak:Playing podcast: [title] - Episode [episode]. Tambahkan methodshowEpisode()yang mencetak:Episode: [episode]Main.java: Tunjukkan upcasting dan downcasting dengan tipe media yang kamu buat. Kamu akan menerima empat input: judul lagu, nama artis, judul podcast, dan nomor episode.Pertama, buat Song lalu lakukan upcasting ke referensi Media. Panggil
play()pada referensi ini untuk melihat polimorfisme saat program dijalankan.Berikutnya, lakukan downcasting pada referensi Media tersebut kembali menjadi Song, lalu panggil
showArtist()untuk mengakses method khusus milik anak.Kemudian, buat Podcast lalu lakukan upcasting ke referensi Media. Panggil
play()pada referensi ini.Terakhir, lakukan downcasting pada referensi Media tersebut kembali menjadi Podcast, lalu panggil
showEpisode().
Kamu akan menerima empat input: judul lagu (String), nama artis (String), judul podcast (String), dan nomor episode (int).
Output-mu harus menampilkan empat baris, dua untuk lagu (output pemutarannya dan informasi artis) dan dua untuk podcast (output pemutarannya dan informasi episode). Perhatikan bahwa upcasting memungkinkan kamu memperlakukan berbagai tipe media secara seragam, sedangkan downcasting memungkinkan kamu mengakses fitur uniknya!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
String songTitle = scanner.nextLine();
String artistName = scanner.nextLine();
String podcastTitle = scanner.nextLine();
int episodeNumber = scanner.nextInt();
// TODO: Buat object Song dan lakukan upcast ke referensi Media
// TODO: Panggil play() melalui referensi Media (menunjukkan polimorfisme)
// TODO: Lakukan downcast pada referensi Media kembali ke Song
// TODO: Panggil showArtist() melalui referensi Song
// TODO: Buat object Podcast dan lakukan upcast ke referensi Media
// TODO: Panggil play() melalui referensi Media
// TODO: Lakukan downcast pada referensi Media kembali ke Podcast
// TODO: Panggil showEpisode() melalui referensi Podcast
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online