JavaRush /Java Blog /Random-ID /Mengonversi tipe referensi di Java
Sant9Iga
Level 41

Mengonversi tipe referensi di Java

Dipublikasikan di grup Random-ID
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. Gambar 1Ada penambahan yang meluas dan menyusut. Kita melihat bahwa kelas tersebut Catmerupakan 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 animalCatdan animalDog. Mereka mengacu pada objek Catdan Dog. Dengan pemeran seperti itu, kita tidak dapat animalCat/animalDogmemanggil 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 RunTimeitu akan memberi tahu Anda:

Exception in thread "main" java.lang.ClassCastException: Animals.Cat cannot be cast to Animals.YorkshireTerrier
RunTimemelihat bahwa Catada YorkshireTerrierdua kelas yang berbeda. Untuk menghindari ClassCastException selama mempersempit konversi, gunakan instanceof.

Animal animalCat = new Cat();
if (animalCat instanceof YorkshireTerrier)
{
    YorkshireTerrier dog = (YorkshireTerrier) animalCat;
}
Jika animalCatya 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 WildAnimalyang diwarisi dariAnimal

public abstract class WildAnimal extends Animal
{
    public void steelChicken()
    {
        System.out.println(nameOfClass+": Muhaha,I stole a chicken!");
    }
}
Kelas Petyang diwarisi dariAnimal

public abstract class Pet extends Animal
{
    public void peeInTray(){
        System.out.println(nameOfClass + ": Master, I peed");
    }
}
Kelas Foxyang diwarisi dariWildAnimal

public class Fox extends WildAnimal
{
    public void eatColobok(){
        System.out.println(nameOfClass + ": I will eat you, Colobok");
    }
}
Kelas Wolfyang diwarisi dariWildAnimal

public class Wolf extends WildAnimal
{
    public void hawlAtTheMoon(){
        System.out.println(nameOfClass + ": Ouuuuu!!!Ouuuu!!!");
    }
}
Kelas Catyang diwarisi dariPet

public class Cat extends Pet
{
    public void sleepOnKeyboard(){
        System.out.println(nameOfClass + ": Master, stop working!!I wanna sleep on your keyboard");
    }
}
Kelas YorkshireTerrieryang 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 ArrayListhewan ( 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 animalmemanggil metode bark()atau sleepOnKeyboard(). Karena lembaran itu allAnimalsberisi 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)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION