JavaRush /Java блогу /Random-KY /Javaдагы Instanceof оператору

Javaдагы Instanceof оператору

Группада жарыяланган
Салам! Бүгүн биз instanceof оператору жөнүндө сүйлөшөбүз, аны колдонуунун мисалдарын карап чыгабыз жана анын иштешине байланыштуу кээ бир жагдайларга токтолобуз :) JavaRushтун алгачкы баскычтарында сиз бул операторго жолуккансыз. Эмне үчүн керек экени эсиңиздеби? Эгерде жок болсо, анда маанилүү эмес, келгиле, чогуу эстейли. instanceof оператору X өзгөрмөсү шилтеме кылган an object кандайдыр бир Y классынын негизинде түзүлгөнүн текшерүү үчүн керек. Жөнөкөй угулат. Эмне үчүн биз бул темага кайтып келдик? Биринчиден, азыр сиз Java жана башка OOP принциптеринде мурастоо механизми менен жакшы таанышсыз. instanceof темасы алда канча айкыныраак болот жана биз өнүккөн колдонуу учурларын карап чыгабыз. Go! Сыноо чын болсо, Instanceof оператору кандай иштейт - 1instanceof оператору чындыкты , ал эми натыйжа жалган болсо, " false" деп кайтарарын эсиңизде болсо керек. Демек, ал көбүнчө ар кандай сыноо шарттарында кездешет ( if…else). жөнөкөй мисалдар менен баштайлы:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Консолго эмне чыгат деп ойлойсуз? Ооба, бул жерде ачык көрүнүп турат :) Объект хбүтүн сан, ошондуктан натыйжа чындык болот . Console чыгарылышы: 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 бири-бирине автоматтык түрдө айландырылбай турганын жана мурастык мамилелерге ээ эмес экенин көрдү. Демек, Integer классынын an objectиси Stringтен түзүлбөйт. Бул ыңгайлуу жана программаны аткаруу учурунда кызыктай каталарды болтурбоого жардам берет, андыктан компилятор бул жерде бизге жардам берди :) Эми татаалыраак мисалдарды карап көрөлү. Биз мурас жөнүндө сөз кылгандыктан, келгиле, бул кичинекей класс системасы менен иштейли:
public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Кадимки кырдаалда an objectтин класска таандык экенин текшергенибизде instanceof кантип иштээрин билебиз, бирок бул жерге ата-эне менен баланын мамилесин кошсок эмне болот? 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, бирок мындай формуладан кемчorк табууга болот. Эмне үчүн бул an object Catкласстын негизинде түзүлгөн Animal? Ал бир гана өз классынын негизинде түзүлгөн эмеспи? Жооп абдан жөнөкөй жана сиз буга чейин эле түшүнгөн болушуңуз мүмкүн. Объектти түзүүдө конструкторлор чакырылган жана өзгөрмөлөр инициализацияланган тартибин унутпаңыз. Биз бул теманы класстын конструктору жөнүндөгү макалада талкуулаганбыз . Мына ошол лекциядан бир мисал:
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 классынын конструктору иштей баштады (Жаныбардын конструктору мурунтан эле аткарылган) Статикалык өзгөрмөнүн учурдагы мааниси catsCount = 37 Куйруктун учурдагы мааниси = Куйруктун баштапкы мааниси Cat класс Куйруктун учурдагы мааниси = Куйрук Азыр эсиңиздеби? :) Базалык класстын конструктору, эгер бар болсо, ар кандай 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);


   }
}
Хмм... бул татаалыраак. Келгиле, ой жүгүртүүгө аракет кылалы. Бизде типтеги өзгөрмө бар Catжана биз ага типтеги an objectти дайындадык MaineCoon. Айтмакчы, бул эмне үчүн иштейт? Муну жасоого болобу? мүмкүн. Кантсе да, бардык Мейн Кун мышык болуп саналат. Эгер ал так эмес болсо, примитивдүү типтеги кеңейтүүлөр менен мисалды эстеңиз:
public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
1024 саны кыска : узун өзгөрмөгө оңой эле батат , анткени ага byteтардын саны жетиштүү (уя салган куурчактар ​​менен болгон мисалды эстейсизби?) . Бала an object ар дайым түпкү өзгөрмөгө дайындалышы мүмкүн. Азырынча ушуну эстеп коюңуз, кийинки лекцияларда биз бул процессти тереңирээк талдайбыз. Анда биздин үлгүбүз эмнеге алып келет?
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тин келип чыгышын текшерет. Ошондуктан, мисалда, эки жолу тең ал консолдо чындыкты көрсөтөт : бизде типтеги an object бар MaineCoon. Албетте, ал класстын негизинде түзүлгөн MaineCoon, бирок ошондой эле ата-энелер классынын негизинде түзүлгөн Cat!
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION