JavaRush /Java блогу /Random-KY /Java'да маалымдама түрлөрүн өзгөртүү
Sant9Iga
Деңгээл

Java'да маалымдама түрлөрүн өзгөртүү

Группада жарыяланган
Жакшы күн, Джараш жигит. Мен Java'да маалымдама түрлөрүн кастинг боюнча суроолорду ала баштадым. Ар бир жолу бир эле нерсени кайталабаш үчүн чакан макала жазууну туура көрдүм.

Биринчиден, кастинг кандай экенин карап көрөлү.

Типти кастинг (типти конвертациялоо) – бир түрдөгү өзгөрмө маанисин башка түрдөгү мааниге айландыруу. Келгиле, анын эмне экенин жана эмне менен жегенин бир мисал карап көрөлү. Бизде класстык иерархия бар ( 1-сүрөттү караңыз ). Бул жерден иерархиянын бардык класстарын, ким кимди мурастай турганын жана ар бир класстын ыкмаларын көрө аласыз. Сүрөт 1Кеңейүү жана жыйрылуу аддукциясы бар. CatКласс класстын тукуму экенин көрөбүз Pet. Pet, өз кезегинде, класстын улантуучусу болуп саналат Animal. Биз жазганда:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Бул кеңейген кастинг (же ачык эмес). Биз шилтемелерди кеңейттик animalCatжана animalDog. Алар an objectтерге Catжана Dog. Мындай кастинг менен биз ичинде бар , бирок ичинде жок animalCat/animalDogшилтеме аркылуу ыкмаларды чакыра албайбыз . Тартуу (же ачык) тескери багытта пайда болот: Cat/DogAnimal
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
RunTimeCatэки башка класс бар экенин көрөт YorkshireTerrier. Конversionны тарытуу учурунда ClassCastException болбош үчүн колдонуңуз instanceof.
Animal animalCat = new Cat();
if (animalCat instanceof YorkshireTerrier)
{
    YorkshireTerrier dog = (YorkshireTerrier) animalCat;
}
Эгерде animalCatал болсо YorkshireTerrier, анда тапшырма ишке ашат, эгер жок болсо, эч нерсе болбойт.

Эми бул эмне үчүн керек, эгерде биз методдорду жоготуп, ушундай каталарды ала турган болсок

Сүрөттөгү диаграммага ылайык мен жасаган codeду карап көрөлү . 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