JavaRush /Java blogi /Random-UZ /Java'da instanceof operatori

Java'da instanceof operatori

Guruhda nashr etilgan
Salom! Bugun biz instanceof operatori haqida gaplashamiz, undan foydalanish misollarini ko'rib chiqamiz va uning ishlashi bilan bog'liq ba'zi fikrlarga to'xtalib o'tamiz :) JavaRushning dastlabki bosqichlarida siz allaqachon ushbu operatorga duch kelgansiz. Bu nima uchun kerakligini eslaysizmi? Agar yo'q bo'lsa, bu muhim emas, keling, birgalikda eslaylik. instanceof operatori X o'zgaruvchisi tomonidan havola qilingan ob'ekt qandaydir Y sinfi asosida yaratilganligini tekshirish uchun kerak. Nega biz bu mavzuga qaytdik? Avvalo, chunki hozir siz Java-dagi meros mexanizmi va boshqa OOP tamoyillari bilan yaxshi tanishsiz. Instanceof mavzusi yanada aniqroq bo'ladi va biz yanada rivojlangan foydalanish holatlarini ko'rib chiqamiz. Bor! Instanceof operatori qanday ishlaydi - 1Ehtimol, esingizda bo'lsa, instanceof operatori test to'g'ri bo'lsa, true qiymatini qaytaradi yoki natija noto'g'ri bo'lsa, noto'g'ri bo'ladi. Binobarin, u ko'pincha har xil turdagi sinov sharoitlarida uchraydi ( if…else). Keling, oddiyroq misollardan boshlaylik:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Sizningcha, konsolga nima chiqadi? Xo'sh, bu erda aniq :) Ob'ekt хbutun son, shuning uchun natija rost bo'ladi . Konsol chiqishi: true Keling, uning, masalan, Stringga tegishli ekanligini tekshirishga harakat qilaylik:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String);// error!
   }
}
Biz xatolik oldik. Va e'tibor bering: kompilyator uni kod bajarilishidan oldin ham chiqargan! U darhol Integer va Stringni avtomatik ravishda bir-biriga aylantira olmasligini va meros munosabatlariga ega emasligini ko'rdi. Shuning uchun Integer sinf ob'ekti Stringdan yaratilmaydi. Bu qulay va dasturni bajarish paytida g'alati xatolardan qochishga yordam beradi, shuning uchun kompilyator bizga bu erda yordam berdi :) Endi murakkabroq misollarni ko'rib chiqishga harakat qilaylik. Biz meros haqida gapirganimiz uchun, keling, ushbu kichik sinf tizimi bilan ishlaylik:
public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Oddiy vaziyatda ob'ekt sinfga tegishli yoki yo'qligini tekshirganda instanceof o'zini qanday tutishini allaqachon bilamiz, lekin bu erga ota-ona munosabatlarini qo'shsak nima bo'ladi? Instanceof operatori qanday ishlaydi - 2 Masalan, sizning fikringizcha, quyidagi tekshiruv nimaga olib keladi:
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);

   }
}
Natija: rost yolg'on Javob berilishi kerak bo'lgan asosiy savol - instanceof "sinf asosida yaratilgan ob'ekt" tushunchasini qanday aniq tushunadi? Natijada, biz buni oldik Сat instanceof Animal == true, lekin bunday formulada xato topish mumkin. Nima uchun bu ob'ekt Catsinf asosida yaratilgan Animal? U faqat o'z sinfiga asoslangan holda yaratilgan emasmi? Javob juda oddiy va siz buni allaqachon tushungan bo'lishingiz mumkin. Ob'ektni yaratishda konstruktorlarni chaqirish va o'zgaruvchilarni ishga tushirish tartibini eslang. Biz allaqachon ushbu mavzuni sinf konstruktori haqidagi maqolada ko'rib chiqdik . Mana o'sha ma'ruzadan bir misol:
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");
   }
}
Va agar siz uni IDE da ishga tushirsangiz, konsol chiqishi quyidagicha ko'rinadi: Animal asosiy sinfining konstruktori ishlayapti Animal sinfining o'zgaruvchilari allaqachon ishga tushirilganmi? Statik o'zgaruvchining joriy qiymati hayvonCount = 7700000 Hayvonlar sinfidagi miyaning joriy qiymati = Hayvonlar sinfidagi miyaning boshlang'ich qiymati Hayvonlar sinfidagi yurakning joriy qiymati = Hayvonlar sinfidagi yurakning boshlang'ich qiymati Hayvonlar sinfidagi asosiy hayvon sinfining konstruktori ishini yakunladi! Miyaning joriy qiymati = Miya Yurakning joriy qiymati = Yurak Cat sinfining konstruktori ishlay boshladi (Hayvon konstruktori allaqachon bajarilgan) Statik o'zgaruvchining joriy qiymati catsCount = 37 Quyruqning joriy qiymati = Quyruqdagi dumning boshlang'ich qiymati Mushuk sinfi Quyruqning joriy qiymati = Quyruq Hozir eslaysizmi? :) Asosiy sinf konstruktori, agar mavjud bo'lsa, har qanday ob'ektni yaratishda doimo birinchi bo'lib chaqiriladi. АInstanceof ob'ekt sinfdan yaratilgan yoki yo'qligini aniqlashga harakat qilganda ushbu tamoyilga amal qiladi Б. Agar asosiy sinf konstruktori chaqirilsa, unda hech qanday shubha bo'lmaydi. Ikkinchi tekshirish bilan hamma narsa oddiyroq:
System.out.println(cat instanceof MaineCoon);
ni yaratishda konstruktor MaineCoonchaqirilmadi Cat, bu mantiqiy. Axir, MaineCoonu ajdod Catemas, avlod. Lekin Catbu shablon emas. OK, bu aniq ko'rinadi. Agar buni qilsak nima bo'ladi:
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 ... bu yanada murakkabroq. Keling, fikr yuritishga harakat qilaylik. Bizda tipdagi o'zgaruvchi bor Catva biz unga turdagi ob'ektni tayinladik MaineCoon. Aytgancha, nega bu hatto ishlaydi? Buni qilish mumkinmi? mumkin. Axir, har qanday Meyn-kun mushukdir. Agar u to'liq tushunarli bo'lmasa, ibtidoiy kengaytmali misolni eslang:
public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
1024 raqami qisqa : u osonlikcha uzun o'zgaruvchiga mos keladi, chunki buning uchun baytlar soni etarli (qo'g'irchoqlar uyasi misolini eslaysizmi?). Doimo ob'ekt har doim ajdod o'zgaruvchiga tayinlanishi mumkin. Hozircha buni eslang va keyingi ma'ruzalarda biz bu jarayonni batafsil tahlil qilamiz. Xo'sh, bizning misolimiz nima beradi?
Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Instanceof nimani tekshiradi: bizning sinf o'zgaruvchimiz Catyoki sinf ob'ektimiz MaineCoon? Aslida, bu savolga javob oddiy. Siz shunchaki operatorimiz taʼrifini yana bir bor oʻqib chiqishingiz kerak boʻladi: instanceof operatori oʻzgaruvchi tomonidan havola qilingan obʼyekt Xbaʼzi bir sinf asosida yaratilgan yoki yoʻqligini tekshirish uchun kerak boʻladi Y. instanceof operatori o'zgaruvchini emas, balki ob'ektning kelib chiqishini tekshiradi. Shuning uchun, misolda, har ikki marta u konsolda true ko'rsatiladi : bizda turdagi ob'ekt mavjud MaineCoon. Tabiiyki, u sinf asosida yaratilgan MaineCoon, balki ota-ona sinfiga ham asoslangan Cat!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION