JavaRush /Блоги Java /Random-TG /Табдил додани намудҳои истинод дар Java
Sant9Iga
Сатҳи

Табдил додани намудҳои истинод дар Java

Дар гурӯҳ нашр шудааст
Рӯз ба хайр, марди Ҷавраш. Ман ба гирифтани саволҳо дар бораи навъҳои истинод дар Java шурӯъ кардам. Барои он ки ҳар дафъа як чизро такрор накунам, ман тасмим гирифтам, ки мақолаи кӯтоҳе нависам.

Аввалан, биёед бубинем, ки навъи кастинг чист.

Кастинги навъи (табдилдиҳии намуд) табдor арзиши тағирёбандаи як намуд ба арзиши навъи дигар аст. Биёед мисолеро бубинем, ки он чӣ аст ва бо чӣ хӯрда мешавад. Мо баъзе иерархияи синф дорем ( ба расми 1 нигаред ). Дар ин ҷо шумо метавонед ҳамаи синфҳои иерархияро бинед, кӣ ба кӣ мерос мегирад ва усулҳои ҳар як синф. Сурати 1Афзоиш ва контраксия вуҷуд дорад. Мо мебинем, ки синф Catаз авлоди синф аст Pet. Pet, дар навбати худ, давомдихандаи синфи Animal. Вақте ки мо менависем:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Ин як ҳайати васеъкунанда аст (ё як ғайриимкон). Мо звенохоро вусъат додем animalCatва animalDog. Онҳо ба an objectҳо Catва Dog. Бо чунин cast, мо наметавонем animalCat/animalDogусулҳоро тавассути истиноде даъват кунем, ки дар Cat/Dog, аммо дар Animal. Намоиши танг (ё возеҳ) дар самти муқобил рух медиҳад:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Cat cat =(Cat)animalCat;
YorkshireTerrier dog = (YorkshireTerrier) animalDog;
Мо ба таври возеҳ нишон додем, ки мо ин an objectро ба кадом намуд партоем. АММО, ЭҲТИЁТ БОШЕД!!! Агар шумо ин тавр кунед:
Animal animalCat = new Cat();
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
компилятор ин codeро мегузаронад. Аммо RunTimeон ба шумо хоҳад дод:
Exception in thread "main" java.lang.ClassCastException: Animals.Cat cannot be cast to Animals.YorkshireTerrier
RunTimeмебинад, ки ду синфи гуногун Catвуҷуд дорад . YorkshireTerrierБарои пешгирӣ кардани ClassCastException ҳангоми табдилдиҳии танг, истифода баред instanceof.
Animal animalCat = new Cat();
if (animalCat instanceof YorkshireTerrier)
{
    YorkshireTerrier dog = (YorkshireTerrier) animalCat;
}
Агар animalCatин бошад YorkshireTerrier, пас супориш ба амал меояд, агар не, ҳеҷ чиз рӯй нахоҳад дод.

Ҳоло ин барои чӣ лозим аст, агар мо усулҳоро аз даст диҳем ва чунин хатогиҳоро ба даст орем

Биёед codeеро бубинем, ки ман мувофиқи диаграмма дар расми 2 сохтаам. 1 . СинфAnimal
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");
    }
}
Синф WildAnimal, ки аз он мерос мегирадAnimal
public abstract class WildAnimal extends Animal
{
    public void steelChicken()
    {
        System.out.println(nameOfClass+": Muhaha,I stole a chicken!");
    }
}
Синф Pet, ки аз он мерос мегирадAnimal
public abstract class Pet extends Animal
{
    public void peeInTray(){
        System.out.println(nameOfClass + ": Master, I peed");
    }
}
Синф Fox, ки аз он мерос мегирадWildAnimal
public class Fox extends WildAnimal
{
    public void eatColobok(){
        System.out.println(nameOfClass + ": I will eat you, Colobok");
    }
}
Синф Wolf, ки аз он мерос мегирадWildAnimal
public class Wolf extends WildAnimal
{
    public void hawlAtTheMoon(){
        System.out.println(nameOfClass + ": Ouuuuu!!!Ouuuu!!!");
    }
}
Синф Cat, ки аз он мерос мегирадPet
public class Cat extends Pet
{
    public void sleepOnKeyboard(){
        System.out.println(nameOfClass + ": Master, stop working!!I wanna sleep on your keyboard");
    }
}
Синф YorkshireTerrier, ки аз он мерос мегирадPet
public class YorkshireTerrier extends Pet
{
    public void bark(){
        System.out.println(nameOfClass + ": Meow!!! Meow!!!");
    }
}
Вазъиятро тасаввур кунед. Мо бояд хамаи хайвонотро дар як руйхат чамъ карда, ба онхо хурок дихем ва баъд хобонем. Ин кор осон аст, агар мо ArrayListҳайвонҳоро эҷод кунем ( Animal). Ва он гоҳ мо усулҳои мувофиқро барои ҳар як ҳайвон меномем:
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();
        }
    }
}
Ман animalусули bark()ё sleepOnKeyboard(). Зеро дар варақ allAnimalsгурба, гург, йорик ва рӯбоҳ мавҷуд аст, аммо онҳо ба Animal. Ва онҳо танҳо усулҳое доранд, ки дар Animal. Ин хеле хуб аст, зеро агар мо метавонистем ҳамаи усулҳоро даъват кунем, пас чаро ба мо гурги дар клавиатура хобида лозим аст ё ёрик, ки мурғдуздӣ мекунад? Ба диққататон ташаккур. Ман умедворам, ки ин мақола барои шумо муфид хоҳад буд. Танқид ва шарҳҳо хуш омадед)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION