Upcasting dan downcasting adalah bagian penting dari Java, yang memungkinkan kita untuk membangun program rumit menggunakan sintaksis sederhana, dan memberi kita keuntungan besar, seperti Polimorfisme atau pengelompokan objek yang berbeda. Java memungkinkan objek tipe subclass untuk diperlakukan sebagai objek dari tipe superclass apa pun. Ini disebut upcasting. Upcasting dilakukan secara otomatis, sementara downcasting harus dilakukan secara manual oleh programmer , dan saya akan memberikan yang terbaik untuk menjelaskan mengapa demikian.
Upcasting dan downcasting TIDAK seperti casting primitif dari satu ke yang lain, dan saya percaya itulah yang menyebabkan banyak kebingungan, ketika programmer mulai belajar benda casting.
Polimorfisme: Semua metode di java adalah virtual secara default. Itu berarti bahwa metode apa pun dapat diganti ketika digunakan dalam warisan, kecuali metode itu dinyatakan final atau statis .
Anda dapat melihat contoh di bawah ini cara getType();
kerjanya sesuai dengan jenis objek (Anjing, Hewan Peliharaan, Anjing Polisi).
Anggaplah Anda memiliki tiga anjing
Anjing - Ini adalah Kelas super.
Pet Dog - Pet Dog memanjang Anjing.
Polisi Anjing - Anjing Polisi memperpanjang Anjing Peliharaan.
public class Dog{
public String getType () {
System.out.println("NormalDog");
return "NormalDog";
}
}
/**
* Pet Dog has an extra method dogName()
*/
public class PetDog extends Dog{
public String getType () {
System.out.println("PetDog");
return "PetDog";
}
public String dogName () {
System.out.println("I don't have Name !!");
return "NO Name";
}
}
/**
* Police Dog has an extra method secretId()
*/
public class PoliceDog extends PetDog{
public String secretId() {
System.out.println("ID");
return "ID";
}
public String getType () {
System.out.println("I am a Police Dog");
return "Police Dog";
}
}
Polimorfisme: Semua metode di java adalah virtual secara default. Itu berarti bahwa metode apa pun dapat diganti ketika digunakan dalam warisan, kecuali metode itu dinyatakan final atau statis. (Penjelasan Milik Konsep Tabel Virtual)
Tabel Virtual / Tabel Pengiriman: Tabel pengiriman objek akan berisi alamat metode yang terikat secara dinamis pada objek. Metode panggilan dilakukan dengan mengambil alamat metode dari tabel pengiriman objek. Tabel pengiriman adalah sama untuk semua objek milik kelas yang sama, dan karena itu biasanya dibagi di antara mereka.
public static void main (String[] args) {
/**
* Creating the different objects with super class Reference
*/
Dog obj1 = new Dog();
` /**
* Object of Pet Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry about it
*
*/
Dog obj2 = new PetDog();
` /**
* Object of Police Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry
* about it here even though we are extending PoliceDog with PetDog
* since PetDog is extending Dog Java automatically upcast for us
*/
Dog obj3 = new PoliceDog();
}
obj1.getType();
Cetakan Normal Dog
obj2.getType();
Cetakan Pet Dog
obj3.getType();
Cetakan Police Dog
Downcasting perlu dilakukan oleh programmer secara manual
Ketika Anda mencoba untuk memanggil secretID();
metode obj3
yang PoliceDog object
tetapi direferensikan Dog
yang merupakan kelas super dalam hierarki itu melempar kesalahan karena obj3
tidak memiliki akses ke secretId()
metode. Untuk memanggil metode itu, Anda perlu Downcast bahwa obj3 secara manual PoliceDog
( (PoliceDog)obj3).secretID();
yang mencetak ID
Dalam cara yang sama untuk memohon dogName();
metode dalam PetDog
kelas Anda perlu tertunduk obj2
untuk PetDog
sejak obj2 dirujuk ke Dog
dan tidak memiliki akses ke dogName();
metode
( (PetDog)obj2).dogName();
Mengapa demikian, bahwa upcasting bersifat otomatis, tetapi downcasting harus manual? Anda tahu, upcasting tidak pernah gagal. Tapi jika Anda memiliki sekelompok berbeda Anjing dan ingin tertunduk mereka semua untuk jenis mereka, maka ada kesempatan, bahwa beberapa Anjing ini sebenarnya dari jenis yang berbeda yaitu, PetDog
, PoliceDog
, dan proses gagal, dengan melempar ClassCastException
.
Ini adalah alasan Anda perlu menurunkan objek Anda secara manual jika Anda telah mereferensikan objek Anda ke tipe kelas super.
Catatan: Di sini dengan merujuk berarti Anda tidak mengubah alamat memori dari oject Anda ketika Anda menurunkannya masih tetap sama, Anda hanya mengelompokkannya ke jenis tertentu dalam kasus ini. Dog
Dog
adalah sebuahAnimal
. Sebagian besar waktu siaran tidak perlu kecuali jika Anda ingin menggunakan metode kelebihan beban tertentu.callme
ada di keduanyaAnimal
danDog
.callme2
hanya ada diDog
, yang Anda melemparkana
untukDog
untuk membuatnya bekerja.