JavaRush /Java блогы /Random-KK /Java тіліндегі Instanceof операторы

Java тіліндегі Instanceof операторы

Топта жарияланған
Сәлеметсіз бе! Бүгін біз instanceof операторы туралы сөйлесеміз, оны пайдалану мысалдарын қарастырамыз және оның жұмысына қатысты кейбір нүктелерге тоқталамыз :) JavaRush-тың бастапқы деңгейлерінде сіз бұл операторды кездестірдіңіз. Не үшін қажет екені есіңізде ме? Олай болмаса, маңызды емес, бірге еске алайық. instanceof операторы X айнымалысы арқылы сілтеме жасалған нысан кейбір Y класы негізінде жасалғанын тексеру үшін қажет. Қарапайым естіледі. Неліктен бұл тақырыпқа қайта оралдық? Біріншіден, қазір сіз Java тіліндегі мұрагерлік механизммен және басқа OOP принциптерімен жақсы таныссыз. Instanceof тақырыбы әлдеқайда түсінікті болады және біз кеңейтілген пайдалану жағдайларын қарастырамыз. Бар! Егер сынақ ақиқатInstanceof операторы қалай жұмыс істейді - 1 болса , instanceof операторы true мәнін немесе нәтиже жалған болса, жалған мәнін қайтаратыны есіңізде болуы мүмкін. Демек, ол көбінесе сынақ жағдайларының әртүрлі түрлерінде кездеседі ( ). Қарапайым мысалдардан бастайық: if…else
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Консольге не шығады деп ойлайсыз? Бұл жерде анық :) Нысан хбүтін сан, сондықтан нәтиже true болады . Консоль шығысы: шын Оның, мысалы, Жолға жататынын тексеріп көрейік:
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 класының нысаны Жолдан жасалмайды. Бұл ыңғайлы және бағдарламаны орындау кезінде оғаш қателерді болдырмауға көмектеседі, сондықтан компилятор бізге бұл жерде көмектесті :) Енді күрделірек мысалдарды қарастырайық. Мұрагерлік туралы айтқандықтан, осы шағын класс жүйесімен жұмыс істейік:
public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Біз қалыпты жағдайда нысанның сыныпқа жататынын тексергенде 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 «сынып негізінде жасалған нысан» түсінігінің шифрын қалай дәл ашады? Нәтижесінде біз оны алдық Сat instanceof Animal == true, бірақ мұндай тұжырымда қате табуға болады. Неліктен бұл нысан 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 класы Құйрықтың ағымдағы мәні = Құйрық Қазір есіңізде ме? :) Негізгі класс конструкторы, егер бар болса, кез келген нысанды жасау кезінде әрқашан бірінші шақырылады. А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 саны жеткілікті (ұя салатын қуыршақтармен мысалды есте сақтаңыз ба?) . Еншілес нысан әрқашан тектік айнымалыға тағайындалуы мүмкін. Әзірше мұны есте сақтаңыз, келесі дәрістерде біз бұл процесті толығырақ талдаймыз. Сонымен, біздің мысал не береді?
Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
instanceof нені тексереді: біздің сынып айнымалысы Catнемесе біздің сынып an objectісі MaineCoon? Шын мәнінде, бұл сұрақтың жауабы қарапайым. Сізге тек операторымыздың анықтамасын қайта оқып шығу керек: instanceof операторы айнымалымен сілтеме жасалған нысан Xкейбір сынып негізінде жасалғанын тексеру үшін қажет Y. instanceof операторы айнымалы емес, нысанның бастапқы орнын тексереді. Сондықтан, мысалда екі рет ол консольде true көрсетеді : бізде түрдегі нысан бар MaineCoon. Әрине, ол сыныпқа негізделген MaineCoon, сонымен қатар ата-аналық сыныпқа негізделген Cat!
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION