JavaRush /Java Blogu /Random-AZ /Java-da istinad növlərinin çevrilməsi
Sant9Iga
Səviyyə

Java-da istinad növlərinin çevrilməsi

Qrupda dərc edilmişdir
Gününüz xeyir, Cavaraş kişi. Java-da istinad növlərinin yayımlanması ilə bağlı suallar almağa başladım. Hər dəfə eyni şeyi təkrarlamamaq üçün qısa bir yazı yazmaq qərarına gəldim.

Əvvəlcə tökmənin hansı növü olduğuna baxaq.

Tip tökmə (tipə çevrilmə) bir növün dəyişən dəyərinin başqa bir növün dəyərinə çevrilməsidir. Bunun nə olduğuna və nə ilə yeyildiyinə dair bir nümunəyə baxaq. Bizdə bəzi sinif iyerarxiyası var ( Şəkil 1-ə baxın ). Burada siz iyerarxiyanın bütün siniflərini, kimin kimə miras qaldığını və hər bir sinfin metodlarını görə bilərsiniz. Şəkil 1Genişlənən və daralan bir adduksiya var. Görürük ki, sinfi Catsinfin nəslindəndir Pet. Pet, öz növbəsində, sinfin davamçısıdır Animal. Yazdığımız zaman:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Bu genişlənən heyətdir (və ya gizlidir). Bağlantıları genişləndirdik animalCatanimalDog. Onlar obyektlərə CatDog. Belə bir cast ilə biz animalCat/animalDog-də olan Cat/Dog, lakin -də olmayan bir istinad vasitəsilə metodları çağıra bilmərik Animal. Daralma (və ya açıq) əks istiqamətdə baş verir:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Cat cat =(Cat)animalCat;
YorkshireTerrier dog = (YorkshireTerrier) animalDog;
Bu obyekti hansı tipə köçürmək istədiyimizi aydın şəkildə göstərmişik. AMMA, DİQQƏTLİ OLUN!!! Bunu belə etsəniz:
Animal animalCat = new Cat();
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
kompilyator bu kodu atlayacaq. Ancaq RunTimeo sizə atacaq:
Exception in thread "main" java.lang.ClassCastException: Animals.Cat cannot be cast to Animals.YorkshireTerrier
RunTimeCatiki fərqli sinif olduğunu görür YorkshireTerrier. Konversiyanı daraltma zamanı ClassCastException-dan qaçmaq üçün istifadə edin instanceof.
Animal animalCat = new Cat();
if (animalCat instanceof YorkshireTerrier)
{
    YorkshireTerrier dog = (YorkshireTerrier) animalCat;
}
Əgər animalCatbelədirsə YorkshireTerrier, onda tapşırıq baş verəcək, yoxsa, heç nə olmayacaq.

Əgər metodları itiririksə və belə xətalar əldə edə biliriksə, bu niyə lazımdır?

Şəkildəki diaqrama uyğun olaraq hazırladığım koda baxaq . 1 . SinifAnimal
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");
    }
}
WildAnimalmiras qalan bir sinifAnimal
public abstract class WildAnimal extends Animal
{
    public void steelChicken()
    {
        System.out.println(nameOfClass+": Muhaha,I stole a chicken!");
    }
}
Petmiras qalan bir sinifAnimal
public abstract class Pet extends Animal
{
    public void peeInTray(){
        System.out.println(nameOfClass + ": Master, I peed");
    }
}
Foxmiras qalan bir sinifWildAnimal
public class Fox extends WildAnimal
{
    public void eatColobok(){
        System.out.println(nameOfClass + ": I will eat you, Colobok");
    }
}
Wolfmiras qalan bir sinifWildAnimal
public class Wolf extends WildAnimal
{
    public void hawlAtTheMoon(){
        System.out.println(nameOfClass + ": Ouuuuu!!!Ouuuu!!!");
    }
}
Catmiras qalan bir sinifPet
public class Cat extends Pet
{
    public void sleepOnKeyboard(){
        System.out.println(nameOfClass + ": Master, stop working!!I wanna sleep on your keyboard");
    }
}
YorkshireTerriermiras qalan bir sinifPet
public class YorkshireTerrier extends Pet
{
    public void bark(){
        System.out.println(nameOfClass + ": Meow!!! Meow!!!");
    }
}
Vəziyyəti təsəvvür edin. Bütün heyvanları bir siyahıda toplamaq, onlara yem vermək və sonra yatağa qoymaq lazımdır. ArrayListHeyvanlar yaratsaq, bunu etmək asandır ( Animal). Və sonra hər bir heyvan üçün müvafiq üsulları çağırırıq:
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();
        }
    }
}
Mən animalmetodu bark()və ya sleepOnKeyboard(). Çünki vərəqdə allAnimalspişik, canavar, yorik və tülkü var, lakin onlar Animal. Onlarda yalnız mövcud olan üsullar var Animal. Bu, çox yaxşıdır, çünki bütün üsulları çağıra bilsək, onda klaviaturada yatan canavar və ya toyuq oğurlayan yorik nəyə lazımdır? Diqqətinizə görə təşəkkürlər. Ümid edirəm bu məqalə sizin üçün faydalı olacaq. Tənqid və şərhlər qəbul olunur)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION