JavaRush /Java Blog /Random-TL /Instanceof operator sa Java

Instanceof operator sa Java

Nai-publish sa grupo
Kamusta! Ngayon ay pag-uusapan natin ang tungkol sa instanceof operator, tingnan ang mga halimbawa ng paggamit nito at pindutin ang ilang mga punto na may kaugnayan sa operasyon nito :) Sa mga unang antas ng JavaRush, nakatagpo mo na ang operator na ito. Naaalala mo ba kung bakit ito kailangan? Kung hindi, hindi mahalaga, sabay nating tandaan. Ang instanceof operator ay kailangan upang suriin kung ang object na isinangguni ng variable X ay nilikha mula sa ilang klase Y. Simple ang tunog. Bakit tayo bumalik sa paksang ito? Una sa lahat, dahil alam mo na ngayon ang mekanismo ng pamana sa Java at iba pang mga prinsipyo ng OOP. Ang paksa ng instanceof ay magiging mas malinaw at titingnan natin ang mas advanced na mga kaso ng paggamit. Go! Paano gumagana ang Instanceof operator - 1Marahil ay naaalala mo na ang instanceof operator ay nagbabalik ng true kung ang pagsubok ay totoo, o mali kung ang resulta ay mali. Dahil dito, ito ay madalas na matatagpuan sa iba't ibang uri ng mga kondisyon ng pagsubok ( if…else). Magsimula tayo sa mas simpleng mga halimbawa:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Ano sa tingin mo ang magiging output sa console? Well, ito ay malinaw dito :) Ang object хay isang Integer, kaya ang resulta ay magiging totoo . Console output: true Subukan nating suriin kung kabilang ito, halimbawa, sa String:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String);// error!
   }
}
Nakatanggap kami ng error. At bigyang-pansin: inilabas ito ng compiler bago pa maisakatuparan ang code! Agad niyang nakita na ang Integer at String ay hindi maaaring awtomatikong ma-convert sa isa't isa at walang mga relasyon sa mana. Samakatuwid, ang isang Integer class object ay hindi malilikha mula sa String. Ito ay maginhawa at nakakatulong upang maiwasan ang mga kakaibang error na sa panahon ng pagpapatupad ng programa, kaya tinulungan kami ng compiler dito :) Ngayon subukan nating tumingin sa mas kumplikadong mga halimbawa. Dahil binanggit natin ang pamana, magtrabaho tayo sa maliit na sistema ng klase na ito:
public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Alam na natin kung paano kumikilos ang instanceof kapag sinusuri natin kung ang isang bagay ay kabilang sa isang klase sa isang normal na sitwasyon, ngunit ano ang mangyayari kung magdaragdag tayo ng relasyon ng magulang-anak dito? Paano gumagana ang Instanceof operator - 2 Halimbawa, ano sa palagay mo ang idudulot ng sumusunod na tseke:
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);

   }
}
Output: true false Ang pangunahing tanong na kailangang masagot ay kung paano eksaktong naiintindihan ng instanceof ang konsepto ng "isang bagay na nilikha batay sa isang klase"? Bilang isang resulta, nakuha namin ito Сat instanceof Animal == true, ngunit ang isa ay maaaring makahanap ng kasalanan sa naturang pagbabalangkas. Bakit Catnilikha ang bagay na ito batay sa klase Animal? Hindi ba ito ay nilikha lamang batay sa sarili nitong klase? Ang sagot ay medyo simple, at maaaring naisip mo na ito. Tandaan ang pagkakasunud-sunod kung saan tinawag ang mga konstruktor at ang mga variable ay sinisimulan kapag lumilikha ng isang bagay. Natalakay na namin ang paksang ito sa artikulo tungkol sa tagabuo ng klase . Narito ang isang halimbawa mula sa panayam na iyon:
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");
   }
}
At kung patakbuhin mo ito sa IDE, ang console output ay magiging ganito: Ang constructor ng base class na Animal ay tumatakbo.Nasimulan na ba ang mga variable ng Animal class? Kasalukuyang halaga ng static na variable na animalCount = 7700000 Kasalukuyang halaga ng utak sa klase ng Hayop = Paunang halaga ng utak sa klase ng Hayop Kasalukuyang halaga ng puso sa klase ng Hayop = Paunang halaga ng puso sa klase ng Hayop Ang constructor ng batayang klase ng Hayop natapos na ang trabaho nito! Kasalukuyang halaga ng utak = Utak Kasalukuyang halaga ng puso = Puso Nagsimula nang gumana ang constructor ng klase ng Cat (naisagawa na ang Animal constructor) Kasalukuyang halaga ng static variable catsCount = 37 Kasalukuyang halaga ng buntot = Paunang halaga ng buntot sa Cat class Kasalukuyang halaga ng buntot = Buntot Naaalala mo na ba ngayon? :) Ang base class constructor, kung mayroon man, ay palaging tinatawag na una kapag lumilikha ng anumang bagay. Sinusunod ng Instanceof ang prinsipyong ito kapag sinusubukan nitong tukuyin kung ang isang bagay ay Аnilikha mula sa isang klase Б. Kung ang base class constructor ay tinawag, kung gayon ay walang duda. Sa pangalawang tseke ang lahat ay mas simple:
System.out.println(cat instanceof MaineCoon);
Ang tagabuo MaineCoonay hindi tinawag kapag lumilikha Cat, na lohikal. Pagkatapos ng lahat, MaineCoonsiya ay isang inapo Cat, hindi isang ninuno. Ngunit Cathindi ito isang template para sa. Ok, ito ay tila malinaw. Ano ang mangyayari kung gagawin natin ito:
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...mas kumplikado ito. Subukan nating mangatwiran. Mayroon kaming isang variable ng uri Cat, at kami ay nagtalaga ng isang bagay ng uri dito MaineCoon. Sa pamamagitan ng paraan, bakit ito gumagana? Posible bang gawin ito? Pwede. Kung tutuusin, kahit sinong Maine Coon ay isang pusa. Kung hindi ito lubos na malinaw, tandaan ang halimbawa na may mga primitive na uri ng extension:
public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Ang bilang na 1024 ay maikli : madali itong umaangkop sa mahabang variable , dahil sapat na ang bilang ng mga byte para dito (tandaan ang halimbawa sa mga nesting doll?). Ang isang child object ay palaging maaaring italaga sa isang ancestor variable. Tandaan lamang ito sa ngayon, at sa mga susunod na lektura ay susuriin pa natin ang prosesong ito. Kaya ano ang idudulot ng ating halimbawa?
Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Ano ang susuriin ng instanceof: ang aming variable ng klase Cato ang object ng aming klase MaineCoon? Sa totoo lang, ang sagot sa tanong na ito ay simple. Kailangan mo lang basahin muli ang kahulugan ng aming operator: Ang instanceof operator ay kailangan upang suriin kung ang bagay na isinangguni ng variable ay Xnilikha batay sa ilang klase Y. Sinusuri ng instanceof operator ang pinagmulan ng isang bagay, hindi isang variable. Samakatuwid, sa halimbawa, parehong beses na ito ay magpapakita ng totoo sa console : mayroon kaming isang bagay ng uri MaineCoon. Naturally, ito ay nilikha batay sa klase MaineCoon, ngunit batay din sa parent class Catdin!
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION