JavaRush /Java blogi /Random-UZ /Java-da mos yozuvlar turlarini aylantirish
Sant9Iga
Daraja

Java-da mos yozuvlar turlarini aylantirish

Guruhda nashr etilgan
Xayrli kun, Javarash yigit. Men Java-da mos yozuvlar turlarini tarqatish bo'yicha savollar ola boshladim. Har safar bir xil narsani takrorlamaslik uchun men kichik maqola yozishga qaror qildim.

Birinchidan, quyma turini ko'rib chiqaylik.

Turni quyish (turni o'zgartirish) - bir turdagi o'zgaruvchan qiymatni boshqa turdagi qiymatga aylantirish. Keling, uning nima ekanligini va nima bilan iste'mol qilinishini misol qilib ko'rib chiqaylik. Bizda ba'zi sinflar ierarxiyasi mavjud ( 1-rasmga qarang ). Bu yerda siz ierarxiyaning barcha sinflarini, kimni meros qilib olishini va har bir sinfning usullarini ko'rishingiz mumkin. 1-rasmKengayuvchi va qisqaruvchi adduksiya mavjud. CatBiz sinfning avlod avlodi ekanligini ko'ramiz Pet. Pet, o'z navbatida, sinfning davomchisi hisoblanadi Animal. Biz yozganimizda:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Bu kengaytiruvchi tarkib (yoki yashirin). Biz havolalarni kengaytirdik animalCatva animalDog. Ular ob'ektlarga Catva Dog. Bunday cast bilan biz animalCat/animalDogichida bo'lgan Cat/Dog, lekin ichida bo'lmagan havola orqali usullarni chaqira olmaymiz Animal. Torayish (yoki aniq) teskari yo'nalishda sodir bo'ladi:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Cat cat =(Cat)animalCat;
YorkshireTerrier dog = (YorkshireTerrier) animalDog;
Biz ushbu ob'ektni qaysi turga o'tkazmoqchi ekanligimizni aniq ko'rsatdik. LEKIN, Ehtiyot bo'ling!!! Agar shunday qilsangiz:
Animal animalCat = new Cat();
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
kompilyator ushbu kodni o'tkazib yuboradi. Ammo RunTimeu sizga ta'sir qiladi:
Exception in thread "main" java.lang.ClassCastException: Animals.Cat cannot be cast to Animals.YorkshireTerrier
RunTimeCatikki xil sinf borligini ko'radi YorkshireTerrier. Konvertatsiyani qisqartirish paytida ClassCastException ni oldini olish uchun foydalaning instanceof.
Animal animalCat = new Cat();
if (animalCat instanceof YorkshireTerrier)
{
    YorkshireTerrier dog = (YorkshireTerrier) animalCat;
}
Agar animalCatshunday bo'lsa YorkshireTerrier, u holda topshiriq sodir bo'ladi, agar bo'lmasa, hech narsa bo'lmaydi.

Endi biz usullarni yo'qotib qo'ysak va bunday xatolarga duch kelsak, bu nima uchun kerak

Keling, rasmdagi diagramma bo'yicha men qilgan kodni ko'rib chiqaylik . 1 . SinfAnimal
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");
    }
}
WildAnimalMeros olgan sinfAnimal
public abstract class WildAnimal extends Animal
{
    public void steelChicken()
    {
        System.out.println(nameOfClass+": Muhaha,I stole a chicken!");
    }
}
PetMeros olgan sinfAnimal
public abstract class Pet extends Animal
{
    public void peeInTray(){
        System.out.println(nameOfClass + ": Master, I peed");
    }
}
FoxMeros olgan sinfWildAnimal
public class Fox extends WildAnimal
{
    public void eatColobok(){
        System.out.println(nameOfClass + ": I will eat you, Colobok");
    }
}
WolfMeros olgan sinfWildAnimal
public class Wolf extends WildAnimal
{
    public void hawlAtTheMoon(){
        System.out.println(nameOfClass + ": Ouuuuu!!!Ouuuu!!!");
    }
}
CatMeros olgan sinfPet
public class Cat extends Pet
{
    public void sleepOnKeyboard(){
        System.out.println(nameOfClass + ": Master, stop working!!I wanna sleep on your keyboard");
    }
}
YorkshireTerrierMeros olgan sinfPet
public class YorkshireTerrier extends Pet
{
    public void bark(){
        System.out.println(nameOfClass + ": Meow!!! Meow!!!");
    }
}
Vaziyatni tasavvur qiling. Biz barcha hayvonlarni bitta ro'yxatda to'plashimiz, ularni ovqatlantirishimiz va keyin ularni yotqizishimiz kerak. ArrayListAgar biz hayvonlarni yaratsak, buni qilish oson ( Animal). Va keyin biz har bir hayvon uchun mos usullarni chaqiramiz:
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();
        }
    }
}
Men yoki animalusulini chaqira olmayman . Chunki varaqda mushuk, bo'ri, yorik va tulki bor, lekin ular ga qisqartiriladi . Va ular faqat mavjud usullarga ega . Bu juda yaxshi, chunki agar biz barcha usullarni chaqira olsak, unda klaviaturada uxlaydigan bo'ri yoki tovuq o'g'irlaydigan yorik nima uchun kerak? E'tiboringiz uchun rahmat. Umid qilamanki, ushbu maqola siz uchun foydali bo'ladi. Tanqid va sharhlar qabul qilinadi) bark()sleepOnKeyboard()allAnimalsAnimalAnimal
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION