Salam! Bu gün mysal operatory barada gürleşeris, ulanylyşynyň mysallaryna serederis we işleýşi bilen baglanyşykly käbir nokatlara degip geçeris :) JavaRush-yň irki derejelerinde bu operatora duş geldiňiz. Näme üçin zerurdygyny ýadyňyzdamy? Notok bolsa, tapawudy ýok, bilelikde ýatda saklalyň. “X” üýtgeýjisine salgylanylýan obýektiň “Y.” synpynyň esasynda döredilendigini ýa-da ýokdugyny barlamak üçin mysal operatory zerurdyr. Näme üçin bu mowzuga gaýdyp geldik? Ilki bilen, sebäbi indi Java-da miras mehanizmi we beýleki OOP ýörelgeleri bilen gowy tanyş. Mysal üçin mowzuk has düşnükli bolar we has ösen ulanylyş ýagdaýlaryna serederis. Git! Synag dogry bolsa ýa-da netije ýalňyş bolsa ýalan bolsa, mysal operatory yzyna gaýdyp gelýär . Netijede, köplenç synag şertleriniň dürli görnüşlerinde bolýar ( ). Has ýönekeý mysallardan başlalyň:
if…else
public class Main {
public static void main(String[] args) {
Integer x = new Integer(22);
System.out.println(x instanceof Integer);
}
}
Siziň pikiriňizçe konsola näme çykar? Dogrusy, bu ýerde düşnükli :) Obýekt х
bitewi, şonuň üçin netije dogry bolar . Konsol çykyşy: true Geliň, meselem, String-e degişlidigini barlamaga synanyşalyň:
public class Main {
public static void main(String[] args) {
Integer x = new Integer(22);
System.out.println(x instanceof String);// error!
}
}
Erroralňyşlyk aldyk Üns beriň: düzüji kod ýerine ýetirilmänkä çykardy! Integer we String-iň awtomatiki usulda biri-birine öwrülip bilmejekdigini we miras gatnaşyklarynyň ýokdugyny derrew gördi. Şonuň üçin “Integer” synp obýekti “String” -den döredilmez. Bu amatly we programmanyň ýerine ýetirilişinde eýýäm geň ýalňyşlyklaryň öňüni almaga kömek edýär, şonuň üçin düzüji bize bu ýerde kömek etdi :) Indi has çylşyrymly mysallara göz aýlamaga synanyşalyň. Miras hakda aýdanymyzdan soň, bu kiçi synp ulgamy bilen işleşeliň:
public class Animal {
}
public class Cat extends Animal {
}
public class MaineCoon extends Cat {
}
Bir obýektiň adaty bir klasa degişlidigini ýa-da ýokdugyny barlanda, mysallaryň özüni alyp barşyny eýýäm bilýäris, ýöne bu ýerde ene-ata gatnaşyklaryny goşsak näme bolar? Mysal üçin, aşakdaky barlag näme öndürer diýip pikir edýärsiňiz:
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);
}
}
Çykyş: hakyky ýalan Jogap berilmeli esasy sorag, mysal üçin “synpa esaslanan döredilen obýekt” düşünjesini nädip kesgitleýär? Netijede, düşündik Сat instanceof Animal == true
, ýöne şeýle formulada kemçilik tapyp bolýar. Näme üçin bu obýekt Cat
synpa esaslanýar Animal
? Diňe öz synpyna esaslanyp döredilenokmy? Jogap gaty ýönekeý, siz eýýäm düşünip bilersiňiz. Gurluşykçylaryň çagyryş tertibini we obýekt döredilende üýtgeýjileriň başlanýandygyny ýadyňyzdan çykarmaň. Bu temany synp konstruktory baradaky makalada eýýäm açypdyk . Ine, şol leksiýadan bir mysal:
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-de işledseňiz, konsolyň çykyşy şeýle bolar: Haýwanlaryň esasy synpynyň konstruktory işleýär. Haýwan synpynyň üýtgeýjileri eýýäm işe girizildimi? Statiki üýtgeýän haýwanlaryň häzirki bahasyCount = 7700000 Haýwanlar synpynda beýniniň häzirki gymmaty = Haýwanlar synpynda beýniniň başlangyç gymmaty Haýwanlar synpynda ýüregiň häzirki gymmaty = Haýwanlar synpynda ýüregiň başlangyç gymmaty Haýwan synpynyň konstruktory işini tamamlady! Beýniniň häzirki gymmaty = Beýni heartüregiň häzirki gymmaty = Heartürek Pişik synpynyň konstruktory işe başlady (Haýwan konstruktory eýýäm ýerine ýetirildi) Statik üýtgeýän pişikleriň häzirki bahasyCount = 37 Guýrugyň häzirki bahasy = Guýrugyň başlangyç bahasy Pişik synpy Guýrugyň häzirki bahasy = Guýruk Indi ýadyňyzdamy? :) Esasy synp konstruktory, bar bolsa, islendik obýekt döredilende hemişe ilki diýilýär. А
Instanceof, bir synpdan bir obýektiň döredilendigini ýa-da ýokdugyny anyklamaga synanyşanda bu ýörelgä eýerýär Б
. Esasy synp konstruktory diýilse, şübhe bolup bilmez. Ikinji barlag bilen hemme zat has ýönekeý:
System.out.println(cat instanceof MaineCoon);
Konstruktor MaineCoon
döredilende çagyrylmady Cat
, bu mantykly. Galyberse-de, MaineCoon
ol Cat
ata-baba däl-de, nesil. Itöne Cat
bu şablon däl. Bolýar, bu düşnükli ýaly. Muny etsek näme bolar:
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 has çylşyrymly. Pikirlenmäge synanyşalyň. Biziň görnüşimiziň üýtgeýjisi bar Cat
we oňa bir görnüş obýekti belledik MaineCoon
. ? Eri gelende aýtsak, bu näme üçin işleýär? Muny edip bolarmy? Bolup biler. Galyberse-de, islendik Maine Kun pişikdir. Eger düýbünden düşnükli däl bolsa, başlangyç görnüşli giňeltmeler bilen mysaly ýatda saklaň:
public class Main {
public static void main(String[] args) {
long x = 1024;
}
}
1024 sany gysga : uzyn üýtgeýjä aňsatlyk bilen gabat gelýär , sebäbi baýtlaryň sany oňa ýeterlikdir (höwürtge gurjaklary bilen mysaly ýadyňyzdamy?). Çaga obýekti hemişe ata-baba üýtgeýjisine bellenip bilner. Muny häzirlikçe ýadyňyzda saklaň we indiki leksiýalarda bu prosesi hasam seljereris. Onda mysalymyz näme öndürer?
Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Barlag mysallary: synp üýtgeýjimiz Cat
ýa-da synp obýektimiz MaineCoon
? Aslynda bu soraga jogap ýönekeý. Diňe operatorymyzyň kesgitlemesini täzeden okamalysyňyz: Üýtgeýji tarapyndan görkezilen obýektiň X
käbir synplara esaslanyp döredilendigini ýa-da ýokdugyny barlamak üçin mysal operatory zerur Y
. Mysal operatory üýtgeýjini däl-de, obýektiň gelip çykyşyny barlaýar. Şonuň üçin, mysalda, iki gezek konsolda hakyky görkeziler : görnüşimiz bar MaineCoon
. MaineCoon
Elbetde, bu klasa esaslanyp , ene-atalar synpyna esaslanyp döredildi Cat
!
GO TO FULL VERSION