JavaRush /Java Blogu /Random-AZ /Java-da instanceof operatoru

Java-da instanceof operatoru

Qrupda dərc edilmişdir
Salam! Bu gün biz instanceof operatoru haqqında danışacağıq, istifadə nümunələrinə baxacağıq və onun işləməsi ilə bağlı bəzi məqamlara toxunacağıq :) JavaRush-un ilk səviyyələrində siz artıq bu operatorla qarşılaşmısınız. Nə üçün lazım olduğunu xatırlayırsınız? Yoxdursa, fərq etməz, gəlin birlikdə xatırlayaq. X dəyişəninin istinad etdiyi obyektin hansısa Y sinfindən yaradılıb-yaradılmadığını yoxlamaq üçün instanceof operatoru lazımdır. Sadə səslənir. Niyə bu mövzuya qayıtdıq? Hər şeydən əvvəl ona görə ki, indi siz Java-da varislik mexanizmi və digər OOP prinsipləri ilə yaxşı tanışsınız. Instanceof mövzusu daha aydın olacaq və biz daha təkmil istifadə hallarına baxacağıq. Get! Instanceof operatoru necə işləyir - 1Yəqin xatırlayırsınız ki, instanceof operatoru test doğrudursa doğru , nəticə yanlışdırsa, yalan qaytarır. Nəticə etibarilə, o, ən çox müxtəlif növ test şəraitlərində rast gəlinir ( if…else). Daha sadə nümunələrlə başlayaq:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Sizcə konsola nə çıxacaq? Yaxşı, burada aydındır :) Obyekt хTam ədəddir, ona görə də nəticə doğru olacaq . Konsol çıxışı: true Gəlin onun, məsələn, String-ə aid olub olmadığını yoxlamağa çalışaq:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String);// error!
   }
}
Xəta aldıq. Və diqqət yetirin: kompilyator onu kod icra edilməmişdən əvvəl də buraxdı! O, dərhal gördü ki, Integer və String avtomatik olaraq bir-birinə çevrilə bilməz və miras əlaqələri yoxdur. Buna görə də, Stringdən Integer sinif obyekti yaradılmayacaq. Bu rahatdır və proqramın icrası zamanı artıq qəribə xətaların qarşısını almağa kömək edir, ona görə də tərtibçi bizə burada kömək etdi :) İndi daha mürəkkəb nümunələrə baxmağa çalışaq. Mirasdan bəhs etdiyimiz üçün gəlin bu kiçik sinif sistemi ilə işləyək:
public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Normal vəziyyətdə obyektin sinfə aid olub-olmadığını yoxlayanda instanceof-un necə davrandığını artıq bilirik, lakin bura valideyn-uşaq münasibətini əlavə etsək nə olar? Instanceof operatoru necə işləyir - 2 Məsələn, sizcə, aşağıdakı çek nə verəcək:
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);

   }
}
Nəticə: doğru yalan Cavab verilməli olan əsas sual, instanceof “sinf əsasında yaradılmış obyekt” anlayışını necə dəqiq deşifrə edir? Nəticə etibarı ilə bunu anladıq Сat instanceof Animal == true, ancaq belə bir tərtibatda səhv tapmaq olar. Niyə bu obyekt Catsinif əsasında yaradılmışdır Animal? O, yalnız öz sinfi əsasında yaradılmayıbmı? Cavab olduqca sadədir və siz bunu artıq başa düşmüsünüz. Obyekt yaratarkən konstruktorların çağırılma və dəyişənlərin işə salınma sırasını yadda saxla. Bu mövzunu artıq sinif konstruktoru haqqında məqalədə əhatə etmişik . Həmin mühazirədən bir nümunə:
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");
   }
}
Əgər siz onu IDE-də işə salsanız, konsol çıxışı belə görünəcək: Animal əsas sinifinin konstruktoru işləyir.Animal sinifinin dəyişənləri artıq işə salınıbmı? Statik dəyişənin cari dəyəri animalCount = 7700000 Heyvanlar sinfində beynin cari dəyəri = Heyvanlar sinfində beynin ilkin dəyəri Heyvanlar sinfində ürəyin cari dəyəri = Heyvanlar sinfində ürəyin ilkin dəyəri Heyvanlar sinfinin əsas konstruktoru işini tamamladı! Beynin cari dəyəri = Beyin Ürəyin cari dəyəri = Ürək Cat sinifinin konstruktoru işə başlamışdır (Heyvan konstruktoru artıq icra edilmişdir) Statik dəyişənlərin cari dəyəri catsCount = 37 Quyruğun cari dəyəri = Quyruğun ilkin dəyəri Pişik sinfi Quyruğun cari dəyəri = Quyruq İndi xatırlayırsınız? :) Baza sinif konstruktoru, əgər varsa, hər hansı obyekt yaratarkən həmişə birinci çağırılır. АInstanceof obyektin sinifdən yaradılıb -yaradılmadığını müəyyən etməyə çalışarkən bu prinsipə əməl edir Б. Baza sinif konstruktoru çağırılırsa, onda heç bir şübhə ola bilməz. İkinci yoxlama ilə hər şey daha sadədir:
System.out.println(cat instanceof MaineCoon);
Yaradarkən konstruktor MaineCoonçağırılmadı Cat, bu məntiqlidir. Axı MaineCoono, əcdad deyil Cat, nəsildir. Amma Catbu, şablon deyil. Ok, bu aydın görünür. Bunu etsək nə olacaq:
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 daha mürəkkəbdir. Gəlin əsaslandırmağa çalışaq. Bizim tip dəyişənimiz var Catvə biz ona tipli bir obyekt təyin etmişik MaineCoon. Yeri gəlmişkən, bu niyə işləyir? Bunu etmək mümkündürmü? Bacarmaq. Axı istənilən Maine Coon pişikdir. Tamamilə aydın deyilsə, primitiv tip uzantıları olan nümunəni xatırlayın:
public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
1024 rəqəmi qısadır : uzun dəyişənə asanlıqla uyğun gəlir , çünki baytların sayı onun üçün kifayətdir (yuva quran kuklalarla nümunəni xatırlayın?). Uşaq obyekt həmişə əcdad dəyişəninə təyin edilə bilər. Hələlik bunu xatırlayın və növbəti mühazirələrdə bu prosesi daha ətraflı təhlil edəcəyik. Beləliklə, nümunəmiz nə verəcək?
Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
instanceof nəyi yoxlayacaq: bizim sinif dəyişənimiz Catyoxsa sinif obyektimiz MaineCoon? Əslində bu sualın cavabı sadədir. Siz sadəcə operatorumuzun tərifini yenidən oxumalısınız: instanceof operatoru dəyişənin istinad etdiyi obyektin Xhansısa sinif əsasında yaradılıb-yaradılmadığını yoxlamaq üçün lazımdır Y. instanceof operatoru dəyişənin yox, obyektin mənşəyini yoxlayır. Buna görə də, nümunədə, hər iki dəfə konsolda true göstərəcək : tipli bir obyektimiz var MaineCoon. Təbii ki, o, sinif əsasında yaradılıb MaineCoon, həm də valideyn sinfinə əsaslanır Cat!
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION