Apa perbedaan antara up-casting dan down-casting sehubungan dengan variabel kelas?
Sebagai contoh dalam program berikut, kelas Animal hanya berisi satu metode tetapi kelas Dog berisi dua metode, lalu bagaimana kita melemparkan variabel Dog ke Variabel Hewan.
Jika casting dilakukan maka bagaimana kita dapat memanggil metode Anjing yang lain dengan variabel Animal.
class Animal
{
public void callme()
{
System.out.println("In callme of Animal");
}
}
class Dog extends Animal
{
public void callme()
{
System.out.println("In callme of Dog");
}
public void callme2()
{
System.out.println("In callme2 of Dog");
}
}
public class UseAnimlas
{
public static void main (String [] args)
{
Dog d = new Dog();
Animal a = (Animal)d;
d.callme();
a.callme();
((Dog) a).callme2();
}
}
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.Jawaban:
Upcasting adalah casting ke supertype, sedangkan downcasting casting ke subtipe. Upcasting selalu diizinkan, tetapi downcasting melibatkan pemeriksaan jenis dan dapat membuang a
ClassCastException
.Dalam kasus Anda, para pemeran dari a
Dog
ke aAnimal
adalah orang yang dibuang, karena aDog
-aAnimal
. Secara umum, Anda dapat menghapus setiap kali ada hubungan antara dua kelas.Downcasting akan menjadi seperti ini:
Pada dasarnya apa yang Anda lakukan adalah memberi tahu kompiler bahwa Anda tahu apa jenis objek runtime sebenarnya . Kompiler akan mengizinkan konversi, tetapi masih akan memasukkan pemeriksaan kewarasan runtime untuk memastikan bahwa konversi masuk akal. Dalam hal ini, para pemain ini dimungkinkan karena pada saat runtime
animal
sebenarnyaDog
meskipun jenis statisanimal
adalahAnimal
.Namun, jika Anda melakukan ini:
Anda akan mendapat
ClassCastException
. Alasan mengapa karenaanimal
jenis runtime adalahAnimal
, dan ketika Anda memberitahu runtime untuk melakukan pemeran itu melihat ituanimal
tidak benar-benarDog
dan melemparkanClassCastException
.Untuk memanggil metode superclass, Anda dapat melakukan
super.method()
atau dengan melakukan upcast.Untuk memanggil metode subclass, Anda harus melakukan downcast. Seperti yang ditunjukkan di atas, Anda biasanya mengambil risiko
ClassCastException
dengan melakukan ini; Namun, Anda dapat menggunakaninstanceof
operator untuk memeriksa jenis runtime objek sebelum melakukan gips, yang memungkinkan Anda untuk mencegahClassCastException
s:sumber
ClassCastException
atau tidak? Seperti dalam kasus pertama?Down-casting dan up-casting adalah sebagai berikut:
Upcasting : Ketika kami ingin memberikan Sub class ke Super class, kami menggunakan Upcasting (atau pelebaran). Itu terjadi secara otomatis, tidak perlu melakukan apa pun secara eksplisit.
Downcasting : Ketika kita ingin melemparkan kelas Super ke kelas Sub, kita menggunakan Downcasting (atau penyempitan), dan Downcasting tidak secara langsung mungkin di Jawa, secara eksplisit harus kita lakukan.
sumber
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.
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)
Cetakan
Normal Dog
Cetakan
Pet Dog
Cetakan
Police Dog
Downcasting perlu dilakukan oleh programmer secara manual
Ketika Anda mencoba untuk memanggil
secretID();
metodeobj3
yangPoliceDog object
tetapi direferensikanDog
yang merupakan kelas super dalam hierarki itu melempar kesalahan karenaobj3
tidak memiliki akses kesecretId()
metode. Untuk memanggil metode itu, Anda perlu Downcast bahwa obj3 secara manualPoliceDog
yang mencetak
ID
Dalam cara yang sama untuk memohon
dogName();
metode dalamPetDog
kelas Anda perlu tertundukobj2
untukPetDog
sejak obj2 dirujuk keDog
dan tidak memiliki akses kedogName();
metodeMengapa 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 melemparClassCastException
.Ini adalah alasan Anda perlu menurunkan objek Anda secara manual jika Anda telah mereferensikan objek Anda ke tipe kelas super.
sumber
Saya tahu pertanyaan ini sudah lama ditanyakan tetapi untuk pengguna baru pertanyaan ini. Silakan baca artikel ini di mana berisi deskripsi lengkap tentang upcasting, downcasting, dan penggunaan instanceof operator
Tidak perlu untuk dihapus secara manual, itu terjadi sendiri:
Mammal m = (Mammal)new Cat();
sama denganMammal m = new Cat();
Tetapi downcasting harus selalu dilakukan secara manual:
Mengapa demikian, bahwa upcasting bersifat otomatis, tetapi downcasting harus manual? Anda tahu, upcasting tidak pernah gagal. Tetapi jika Anda memiliki sekelompok Hewan yang berbeda dan ingin menurunkan mereka semua ke Kucing, maka ada kemungkinan, bahwa beberapa Hewan ini sebenarnya adalah Anjing, dan prosesnya gagal, dengan melempar ClassCastException. Di sinilah harus memperkenalkan fitur berguna yang disebut "instanceof" , yang menguji apakah suatu objek adalah instance dari beberapa Kelas.
Untuk informasi lebih lanjut silakan baca artikel ini
sumber
Lebih baik coba metode ini untuk upcasting, mudah dimengerti:
sumber
Mungkin tabel ini membantu. Memanggil
callme()
metode kelasParent
atau kelasChild
. Sebagai prinsip:sumber
1.- Siaran.
Melakukan upcasting, Anda menetapkan tag dari beberapa jenis, yang menunjuk ke objek subtipe (Jenis dan subtipe dapat disebut kelas dan subkelas, jika Anda merasa lebih nyaman ...).
Apa artinya bahwa tag tersebut, animalCat, akan memiliki fungsionalitas (metode) dari tipe Hewan saja, karena kami telah mendeklarasikannya sebagai tipe Hewan, bukan sebagai tipe Kucing.
Kami diizinkan untuk melakukannya dengan cara "alami / implisit / otomatis", pada waktu kompilasi atau pada saat run-time, terutama karena Cat mewarisi beberapa fungsinya dari Animal; misalnya, pindah (). (Setidaknya, kucing adalah binatang, bukan?)
2.- Downcasting.
Tapi, apa yang akan terjadi jika kita perlu mendapatkan fungsionalitas Cat, dari tag Animal type kita ?.
Karena kami telah membuat tag animalCat yang menunjuk ke objek Cat, kami membutuhkan cara untuk memanggil metode objek Cat, dari tag animalCat kami dengan cara yang cukup cerdas.
Prosedur semacam itu adalah apa yang kita sebut Downcasting, dan kita dapat melakukannya hanya pada saat run-time.
Waktu untuk beberapa kode:
sumber
Induk: Mobil
Anak: Figo
Mobil c1 = Figo baru ();
=====
Upcasting: -
Metode: Objek c1 akan merujuk ke Metode Kelas (Figo - Metode harus diganti) karena kelas "Figo" ditentukan dengan "baru".
Variabel Instance: Objek c1 akan merujuk ke variabel instan dari Kelas Deklarasi ("Mobil").
Ketika kelas Deklarasi adalah orang tua dan objek dibuat dari anak, maka casting implisit terjadi yaitu "Upcasting".
======
Downcasting: -
Figo f1 = (Figo) c1; //
Metode: Objek f1 akan merujuk ke Metode Kelas (figo) sebagai objek awal c1 dibuat dengan kelas "Figo". tetapi setelah pengecoran selesai, metode yang hanya ada di kelas "Figo" juga dapat dirujuk oleh variabel f1.
Variabel Instance: Objek f1 tidak akan merujuk ke variabel instan dari kelas Deklarasi objek c1 (kelas deklarasi untuk c1 adalah CAR) tetapi dengan down casting akan merujuk ke variabel instance dari kelas Figo.
======
Gunakan: Ketika Objek adalah dari Kelas Anak dan kelas deklarasi adalah Orang Tua dan kelas Anak ingin mengakses variabel Instance dari kelas itu sendiri dan bukan dari kelas induk maka dapat dilakukan dengan "Downcasting".
sumber
upcasting berarti casting objek ke supertype, sedangkan downcasting berarti casting ke subtype.
Di java, upcasting tidak perlu karena dilakukan secara otomatis. Dan biasanya disebut casting implisit. Anda dapat menentukannya untuk menjelaskan kepada orang lain.
Demikian tulisan
atau
mengarah ke titik yang sama persis dan dalam kedua kasus akan dieksekusi
callme()
dariDog
.Downcasting sebaliknya diperlukan karena Anda didefinisikan
a
sebagai objek Animal. Saat ini Anda tahu itu adalahDog
, tetapi java tidak memiliki jaminan itu. Sebenarnya saat runtime bisa berbeda dan java akan melemparClassCastException
, apakah itu akan terjadi. Tentu saja bukan itu contoh contoh Anda sendiri. Jika Anda tidak akan dilemparkana
keAnimal
java, bahkan tidak bisa mengkompilasi aplikasi karenaAnimal
tidak memiliki metodecallme2()
.Dalam contoh Anda tidak dapat mencapai kode
callme()
dariAnimal
dariUseAnimlas
(karenaDog
menimpa itu) kecuali metode akan sebagai berikut:sumber
Kita dapat membuat objek ke Downcasting. Dalam tipe ini juga. : memanggil metode kelas dasar
sumber