JavaRush /Java Blog /Random-TL /Pag-convert ng mga uri ng sanggunian sa Java
Sant9Iga
Antas

Pag-convert ng mga uri ng sanggunian sa Java

Nai-publish sa grupo
Magandang araw, Javarash man. Nagsimula akong makatanggap ng mga tanong tungkol sa pag-cast ng mga uri ng sanggunian sa Java. Upang hindi na muling isalaysay ang parehong bagay sa bawat oras, nagpasya akong magsulat ng isang maikling artikulo.

Una, tingnan natin kung anong uri ng casting.

Ang type casting (type conversion) ay ang conversion ng variable na value ng isang uri sa value ng ibang uri. Tingnan natin ang isang halimbawa ng kung ano ito at kung ano ang kinakain nito. Mayroon kaming ilang hierarchy ng klase ( tingnan ang Figure 1 ). Dito makikita mo ang lahat ng mga klase ng hierarchy, kung sino ang nagmamana, at ang mga pamamaraan ng bawat klase. Рисунок 1Mayroong pagpapalawak at pagkontrata ng adduction. Nakikita natin na ang klase Catay isang inapo ng klase Pet. Pet, siya namang kahalili ng klase Animal. Kapag sumulat tayo:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Ito ay isang lumalawak na cast (o isang implicit). Pinalawak namin ang mga link animalCatat animalDog. Tinutukoy nila ang mga bagay Catat Dog. Sa ganoong cast, hindi kami animalCat/animalDogmakakatawag ng mga pamamaraan sa pamamagitan ng isang link na nasa Cat/Dog, ngunit wala sa Animal. Ang isang narrowing (o tahasang) cast ay nangyayari sa kabaligtaran na direksyon:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Cat cat =(Cat)animalCat;
YorkshireTerrier dog = (YorkshireTerrier) animalDog;
Malinaw naming ipinahiwatig kung anong uri ang gusto naming i-cast ang bagay na ito. PERO, MAG-INGAT!!! Kung gagawin mo ito tulad nito:
Animal animalCat = new Cat();
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
laktawan ng compiler ang code na ito. Ngunit RunTimeitatapon nito sa iyo:
Exception in thread "main" java.lang.ClassCastException: Animals.Cat cannot be cast to Animals.YorkshireTerrier
RunTimenakikita na Catmayroong YorkshireTerrierdalawang magkaibang klase. Upang maiwasan ang ClassCastException sa panahon ng pagpapaliit ng conversion, gamitin ang instanceof.
Animal animalCat = new Cat();
if (animalCat instanceof YorkshireTerrier)
{
    YorkshireTerrier dog = (YorkshireTerrier) animalCat;
}
Kung animalCatito ay YorkshireTerrier, kung gayon ang pagtatalaga ay magaganap, kung hindi, walang mangyayari.

Ngayon bakit ito kinakailangan kung mawawalan tayo ng mga pamamaraan at maaaring makakuha ng mga ganitong error

Tingnan natin ang code na ginawa ko ayon sa diagram sa Fig. 1 . KlaseAnimal
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");
    }
}
Isang klase WildAnimalna nagmana mula saAnimal
public abstract class WildAnimal extends Animal
{
    public void steelChicken()
    {
        System.out.println(nameOfClass+": Muhaha,I stole a chicken!");
    }
}
Isang klase Petna nagmana mula saAnimal
public abstract class Pet extends Animal
{
    public void peeInTray(){
        System.out.println(nameOfClass + ": Master, I peed");
    }
}
Isang klase Foxna nagmana mula saWildAnimal
public class Fox extends WildAnimal
{
    public void eatColobok(){
        System.out.println(nameOfClass + ": I will eat you, Colobok");
    }
}
Isang klase Wolfna nagmana mula saWildAnimal
public class Wolf extends WildAnimal
{
    public void hawlAtTheMoon(){
        System.out.println(nameOfClass + ": Ouuuuu!!!Ouuuu!!!");
    }
}
Isang klase Catna nagmana mula saPet
public class Cat extends Pet
{
    public void sleepOnKeyboard(){
        System.out.println(nameOfClass + ": Master, stop working!!I wanna sleep on your keyboard");
    }
}
Isang klase YorkshireTerrierna nagmana mula saPet
public class YorkshireTerrier extends Pet
{
    public void bark(){
        System.out.println(nameOfClass + ": Meow!!! Meow!!!");
    }
}
Isipin ang sitwasyon. Kailangan nating kolektahin ang lahat ng mga hayop sa isang listahan, pakainin sila at pagkatapos ay ilagay sa kama. Madaling gawin ito kung gagawa tayo ArrayListng mga hayop ( Animal). At pagkatapos ay tinawag namin ang kaukulang mga pamamaraan para sa bawat hayop:
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();
        }
    }
}
Hindi ko animalmatatawag ang pamamaraan bark()o sleepOnKeyboard(). Dahil ang sheet allAnimalsay naglalaman ng isang pusa, isang lobo, isang yorick at isang fox, ngunit sila ay nabawasan sa Animal. At mayroon lamang silang mga pamamaraan na nasa Animal. Ito ay napakahusay, dahil kung maaari nating tawagan ang lahat ng mga pamamaraan, kung gayon bakit kailangan natin ng isang lobo na natutulog sa keyboard, o isang yorick na nagnanakaw ng mga manok? Salamat sa iyong atensyon. Umaasa ako na ang artikulong ito ay magiging kapaki-pakinabang sa iyo. Ang mga kritisismo at komento ay malugod na tinatanggap)
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION