Selamat siang, kawan Javarash. Saya mulai menerima pertanyaan tentang casting tipe referensi di Java. Agar tidak menceritakan kembali hal yang sama setiap saat, saya memutuskan untuk menulis artikel pendek.
Pertama, mari kita lihat apa itu tipe casting.
Type casting (konversi tipe) adalah konversi nilai variabel dari satu tipe ke nilai tipe lain. Mari kita lihat contohnya dan apa yang dimakannya. Kami memiliki beberapa hierarki kelas ( lihat Gambar 1 ). Di sini Anda dapat melihat semua kelas dalam hierarki, siapa yang mewarisi siapa, dan metode setiap kelas. Ada penambahan yang meluas dan menyusut. Kita melihat bahwa kelas tersebutCat
merupakan turunan dari kelas tersebut Pet
. Pet
, pada gilirannya, adalah penerus kelas Animal
. Saat kita menulis:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Ini adalah pemeran yang berkembang (atau pemeran implisit). Kami telah memperluas tautan animalCat
dan animalDog
. Mereka mengacu pada objek Cat
dan Dog
. Dengan pemeran seperti itu, kita tidak dapat animalCat/animalDog
memanggil metode melalui tautan yang ada di Cat/Dog
, tetapi tidak ada di Animal
. Pemeran yang menyempit (atau eksplisit) terjadi pada arah yang berlawanan:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Cat cat =(Cat)animalCat;
YorkshireTerrier dog = (YorkshireTerrier) animalDog;
Kami telah dengan jelas menunjukkan jenis objek apa yang ingin kami gunakan. TETAPI BERHATI-HATILAH!!! Jika Anda melakukannya seperti ini:
Animal animalCat = new Cat();
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
kompiler akan melewatkan kode ini. Tapi RunTime
itu akan memberi tahu Anda:
Exception in thread "main" java.lang.ClassCastException: Animals.Cat cannot be cast to Animals.YorkshireTerrier
RunTime
melihat bahwa Cat
ada YorkshireTerrier
dua kelas yang berbeda. Untuk menghindari ClassCastException selama mempersempit konversi, gunakan instanceof
.
Animal animalCat = new Cat();
if (animalCat instanceof YorkshireTerrier)
{
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
}
Jika animalCat
ya YorkshireTerrier
, maka penugasan akan terjadi, jika tidak, tidak akan terjadi apa-apa.
Sekarang mengapa ini perlu jika kita kehilangan metode dan bisa mendapatkan kesalahan seperti itu
Mari kita lihat kode yang saya buat sesuai diagram pada Gambar. 1 . KelasAnimal
public abstract class Animal
{
String name;
int age;
String nameOfClass = getClass().getSimpleName();
public void eat(){
System.out.println(nameOfClass + ": Omnomnom");
}
public void sleep(){
System.out.println(nameOfClass + ": Z-z-z-z");
}
}
Kelas WildAnimal
yang diwarisi dariAnimal
public abstract class WildAnimal extends Animal
{
public void steelChicken()
{
System.out.println(nameOfClass+": Muhaha,I stole a chicken!");
}
}
Kelas Pet
yang diwarisi dariAnimal
public abstract class Pet extends Animal
{
public void peeInTray(){
System.out.println(nameOfClass + ": Master, I peed");
}
}
Kelas Fox
yang diwarisi dariWildAnimal
public class Fox extends WildAnimal
{
public void eatColobok(){
System.out.println(nameOfClass + ": I will eat you, Colobok");
}
}
Kelas Wolf
yang diwarisi dariWildAnimal
public class Wolf extends WildAnimal
{
public void hawlAtTheMoon(){
System.out.println(nameOfClass + ": Ouuuuu!!!Ouuuu!!!");
}
}
Kelas Cat
yang diwarisi dariPet
public class Cat extends Pet
{
public void sleepOnKeyboard(){
System.out.println(nameOfClass + ": Master, stop working!!I wanna sleep on your keyboard");
}
}
Kelas YorkshireTerrier
yang diwarisi dariPet
public class YorkshireTerrier extends Pet
{
public void bark(){
System.out.println(nameOfClass + ": Meow!!! Meow!!!");
}
}
Bayangkan situasinya. Kita perlu mengumpulkan semua hewan dalam satu daftar, memberi mereka makan, lalu menidurkannya. Hal ini mudah dilakukan jika kita membuat ArrayList
hewan ( Animal
). Lalu kami memanggil metode yang sesuai untuk setiap hewan:
public class ZOO
{
public static void main(String[] args)
{
List<Animal> allAnimals = new ArrayList<>();
allAnimals.add(new Cat());
allAnimals.add(new Wolf());
allAnimals.add(new Fox());
allAnimals.add(new YorkshireTerrier());
for (Animal animal : allAnimals)
{
animal.eat();
animal.sleep();
}
}
}
Saya tidak dapat animal
memanggil metode bark()
atau sleepOnKeyboard()
. Karena lembaran itu allAnimals
berisi kucing, serigala, yorick, dan rubah, tetapi semuanya direduksi menjadi Animal
. Dan mereka hanya memiliki metode yang ada di Animal
. Ini sangat bagus, karena jika kita bisa memanggil semua metode, mengapa kita membutuhkan serigala yang tidur di keyboard, atau yorick yang mencuri ayam? Terima kasih atas perhatian Anda. Saya harap artikel ini bermanfaat bagi Anda. Kritik dan komentar dipersilahkan)
GO TO FULL VERSION