JavaRush /Блоги Java /Random-TG /Оператори Instanceof дар Java

Оператори Instanceof дар Java

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо дар бораи оператори instanceof сӯҳбат мекунем, мисолҳои истифодаи онро дида мебароем ва ба баъзе нуктаҳои марбут ба кори он дахл мекунем :) Дар сатҳҳои аввали JavaRush, шумо аллакай бо ин оператор дучор шудаед. Дар хотир доред, ки чаро он лозим аст? Агар не, муҳим нест, биёед якҷоя ба ёд орем. Оператори instanceof барои тафтиш кардан лозим аст, ки оё an objectи бо тағирёбандаи X истинодшуда аз ягон синфи Y сохта шудааст ё не. Садо оддӣ аст. Чаро мо ба ин мавзӯъ баргаштем? Пеш аз ҳама, зеро ҳоло шумо бо механизми мерос дар Java ва дигар принсипҳои OOP хуб шиносед. Мавзӯи instanceof хеле равшантар хоҳад шуд ва мо ба ҳолатҳои пешрафтатари истифода назар хоҳем кард. Бирав! Оператори Instanceof чӣ гуна кор мекунад - 1Эҳтимол шумо дар хотир доред, ки оператори instanceof, агар санҷиш дуруст бошад, ҳақиқӣ ё бардурӯғ , агар натиҷа нодуруст бошад, бармегардад. Аз ин рӯ, он аксар вақт дар намудҳои гуногуни шароити санҷиш пайдо мешавад ( if…else). Биёед бо мисолҳои соддатар оғоз кунем:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Ба фикри шумо, ба консол чӣ натиҷа дода мешавад? Хуб, ин ҷо аён аст :) Объект хадади бутун аст, бинобар ин натиҷа дуруст хоҳад буд . Натиҷаи консол: true Биёед кӯшиш кунем тафтиш кунем, ки он, масалан, ба String тааллуқ дорад:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String);// error!
   }
}
Мо хато гирифтем. Ва диққат диҳед: компилятор онро ҳатто пеш аз иҷро шудани code баровардааст! Вай фавран дид, ки Integer ва String наметавонанд ба таври худкор ба ҳамдигар табдил дода шаванд ва муносибатҳои меросӣ надоранд. Аз ин рӯ, an objectи синфи Integer аз String сохта намешавад. Ин қулай аст ва барои пешгирӣ кардани хатогиҳои аҷибе, ки аллакай ҳангоми иҷрои барнома кӯмак мекунад, аз ин рӯ компилятор ба мо дар ин ҷо кӯмак кард :) Акнун биёед кӯшиш кунем, ки мисолҳои мураккабтарро бубинем. Азбаски мо меросро зикр кардем, биёед бо ин системаи синфи хурд кор кунем:
public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Мо аллакай медонем, ки instanceof чӣ гуна рафтор мекунад, вақте ки мо тафтиш мекунем, ки оё an object дар вазъияти муқаррарӣ ба синф тааллуқ дорад, аммо агар мо дар ин ҷо муносибати волидайн ва кӯдакро илова кунем, чӣ мешавад? Оператори Instanceof чӣ гуна кор мекунад - 2 Масалан, шумо фикр мекунед, ки чеки зерин чӣ натиҷа медиҳад:
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();

       System.out.println(cat instanceof Animal);

       System.out.println(cat instanceof MaineCoon);

   }
}
Натиҷа: ҳақиқӣ бардурӯғ Саволи асосие, ки бояд ҷавоб дода шавад, ин аст, ки чӣ тавр instanceof мафҳуми "an objectеро, ки дар асоси синф сохта шудааст" шифр мекунад? Дар натиҷа, мо онро ба даст овардем Сat instanceof Animal == true, аммо дар чунин формула метавон айб пайдо кард. Чаро ин an object Catдар асоси синф сохта шудааст Animal? Оё он танҳо дар асоси синфи худ офарида нашудааст? Ҷавоб хеле оддӣ аст ва шумо шояд аллакай фаҳмидед. Тартиби даъват кардани конструкторҳо ва тағирёбандаҳо ҳангоми сохтани an objectро дар хотир нигоҳ доред. Мо аллакай ин мавзӯъро дар мақола дар бораи созандаи синф баррасӣ кардем . Инак як мисол аз он лексия:
public class Animal {

   String brain = "The initial value of brain in the Animal class";
   String heart = "The initial value of heart in the Animal class";

   public static int animalCount = 7700000;

   public Animal(String brain, String heart) {
       System.out.println("The constructor of the Animal base class is being executed");
       System.out.println("Have the variables of the Animal class already been initialized?");
       System.out.println("The current value of the static variable animalCount = " + animalCount);
       System.out.println("Current value of brain in class Animal = " + this.brain);
       System.out.println("Current value of heart in class Animal = " + this.heart);

       this.brain = brain;
       this.heart = heart;
       System.out.println("Animal base class constructor completed!");
       System.out.println("Current value of brain = " + this.brain);
       System.out.println("Current value of heart = " + this.heart);
   }
}

class Cat extends Animal {

   String tail = "The initial value of tail in the Cat class";

   static int catsCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println("The constructor of the Cat class has started (the Animal constructor has already been executed)");
       System.out.println("The current value of the static variable catsCount = " + catsCount);
       System.out.println("Current value tail = " + this.tail);
       this.tail = tail;
       System.out.println("Current value tail = " + this.tail);
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Ва агар шумо онро дар IDE иҷро кунед, баромади консол чунин хоҳад буд: Конструктори синфи асосии Animal кор мекунад Оё тағирёбандаҳои синфи Animal аллакай оғоз карда шудаанд? Арзиши ҷории тағирёбандаи статикии animalCount = 7700000 Арзиши ҷории майна дар синфи Animal = Арзиши ибтидоии майна дар синфи ҳайвонот арзиши ҷории дил дар синфи ҳайвонот = Арзиши ибтидоии дил дар синфи ҳайвонот кори худро ба охир расонд! Қимати ҷории майна = Майна Қимати ҷории дил = Дил Созандаи синфи Cat ба кор шурӯъ кард (созандаи Animal аллакай иҷро шудааст) Арзиши ҷории тағирёбандаи статикӣ catsCount = 37 Қимати ҷории дум = Қимати ибтидоии дум дар Синфи гурба Арзиши кунунии дум = Дум Шумо ҳоло дар хотир доред? :) Созандаи синфи базавӣ, агар мавҷуд бошад, ҳангоми сохтани ягон an object ҳамеша аввал даъват карда мешавад. Instanceof ин принсипро риоя мекунад, вақте ки он кӯшиш мекунад муайян кунад, ки оё an object Ааз синф сохта шудааст ё не Б. Агар конструктори синфи базавӣ даъват карда шавад, он гоҳ шубҳае нест. Бо санҷиши дуюм ҳама чиз осонтар аст:
System.out.println(cat instanceof MaineCoon);
Ҳангоми эҷод конструктор MaineCoonдаъват карда нашудааст Cat, ки ин мантиқист. Охир, MaineCoonвай авлод аст Cat, на аҷдод. Аммо Catон як шаблон барои. Хуб, ин равшан ба назар мерасад. Агар мо ин корро кунем, чӣ мешавад:
public class Main {

   public static void main(String[] args) {

       Cat cat = new MaineCoon();

       System.out.println(cat instanceof Cat);
       System.out.println(cat instanceof MaineCoon);


   }
}
Hmm ... ин мушкилтар аст. Биёед кӯшиш кунем, ки фикр кунем. Мо як тағирёбандаи навъи дорем Catва мо ба он an objectи типро таъин кардем MaineCoon. Дар омади гап, чаро ин ҳатто кор мекунад? Оё ин корро кардан мумкин аст? Метавонед. Баъд аз ҳама, ҳама Мейн Кун гурба аст. Агар он комилан равшан набошад, мисоли васеъшавии навъи ибтидоиро дар хотир нигоҳ доред:
public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Рақами 1024 кӯтоҳ аст : он ба осонӣ ба тағирёбандаи дароз мувофиқат мекунад , зеро шумораи byteҳо барои он кифоя аст (мисоли лӯхтакҳои лонаро дар хотир доред?). Объекти кӯдак ҳамеша метавонад ба тағирёбандаи аҷдодӣ таъин карда шавад. Танҳо инро дар хотир нигоҳ доред ва дар лексияҳои оянда мо ин равандро минбаъд таҳлил хоҳем кард. Пас, мисоли мо чӣ меорад?
Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
instanceof чиро тафтиш мекунад: тағирёбандаи синфи мо Catё an objectи синфии мо MaineCoon? Дар асл, ҷавоб ба ин савол оддӣ аст. Шумо танҳо лозим аст, ки таърифи оператори моро дубора хонед: Оператори instanceof барои санҷидани он ки оё an objectи аз ҷониби тағирёбанда истинодшуда Xдар асоси баъзе синф сохта шудааст, лозим аст Y. Оператори instanceof пайдоиши an objectро месанҷад, на тағирёбанда. Аз ин рӯ, дар мисол, ҳарду дафъа он дар консол true нишон медиҳад : мо an objectи навъи MaineCoon. Табиист, ки он дар асоси синф сохта шудааст MaineCoon, аммо инчунин дар асоси синфи волидайн Cat!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION