JavaRush /Java Blog /Random-TK /Salgy görnüşleriniň giňelmegi we gysylmagy

Salgy görnüşleriniň giňelmegi we gysylmagy

Toparda çap edildi
Salam! Öňki leksiýalaryň birinde başlangyç görnüşleri kast etmek meselesini ara alyp maslahatlaşdyk. Gepleýän zatlarymyzy gysgaça ýada salalyň. Salgy görnüşleriniň giňelmegi we gysylmagy - 1Ilkinji görnüşleri (bu ýagdaýda san) tutýan ýadynyň mukdaryna görä höwürtge gurjaklary hökmünde görkezýärdik. .Adyňyzda bolsa, kiçijik höwürtge gurjagyny has ulurak ýerleşdirmek hakyky durmuşda-da, Java programmirlemekde-de ýönekeý bolar.
public class Main {
   public static void main(String[] args) {
        short smallNumber = 100;
        int bigNumber =  smallNumber;
        System.out.println(bigNumber);
   }
}
Bu awtomatiki öwrülişigiň ýa-da giňeltmegiň mysaly . Öz-özünden bolýar, şonuň üçin goşmaça kod ýazmagyň zerurlygy ýok. Netijede, üýtgeşik bir zat etmeýäris: has kiçi höwürtge gurjagyna has kiçi höwürtge gurýarys. Munuň tersini edip, uly matrioşka gurjagyny kiçisine saljak bolsak başga mesele. Muny durmuşda edip bolmaýar, ýöne programmirlemekde edip bolýar. Oneöne bir gowak bar. intÜýtgeýjä baha goýjak bolsak short, bu aňsat bolmaz. Galyberse-de, diňe 16 bit maglumat üýtgeýjä gabat gelip biler short, ýöne bahasy int32 bit alýar! Netijede, berlen baha ýoýulýar. Düzediji bize ýalňyşlyk berer (“ dost, sen şübheli bir zat edýärsiň! ”), Whatöne gymmatymyzy haýsy görnüşe gönükdirýändigimizi aç-açan kesgitlesek, şonda-da şeýle amal eder.
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       bigNumber = (short) bigNumber;

       System.out.println(bigNumber);

   }

}
Aboveokardaky mysalda, edil şony etdik. Amal tamamlandy, ýöne short32 bitden diňe 16-synyň üýtgeýjä laýyk gelýändigi sebäpli iň soňky bahasy ýoýuldy we netijede -27008 belgisini aldyk . Bu amal aç-açan öwrülişik ýa-da daralmak diýilýär .

Salgy görnüşleriniň uzalmagyna we gysylmagyna mysallar

Indi şol bir amallar hakda gürleşeris, ýöne başlangyç görnüşlere däl-de, obýektlere we salgylanma üýtgeýjilerine degişlidir ! Bu Java-da nähili işleýär? Aslynda gaty ýönekeý. Biri-birine bagly bolmadyk zatlar bar. Birek-birege aç-açan ýa-da awtomatiki öwrüp bolmajakdygyny çaklamak mantykly bolar:
public class Cat {
}

public class Dog {
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Dog();//error!

   }

}
Bu ýerde, elbetde, ýalňyşlyk alarys. Sapaklar biri-biri bilen baglanyşykly Catdäl Dogwe biz biri-birimize “öwrüji” ýazmadyk. Muny edip bilmejekdigimiz mantykly: düzüji bu zatlary biri-birine nädip öwürmelidigini bilmeýär. Jisimler biri-birine bagly bolsa başga mesele! Nädip? Ilki bilen mirasy ulanmak. Miras bilen kiçi synp ulgamyny döretmäge synanyşalyň. Haýwanlary görkezýän umumy synpymyz bolar:
public class Animal {

   public void introduce() {

       System.out.println("i'm Animal");
   }
}
Bilşiňiz ýaly haýwanlar öý we ýabanydyr:
public class WildAnimal extends Animal {

   public void introduce() {

       System.out.println("i'm WildAnimal");
   }
}

public class Pet extends Animal {

   public void introduce() {

       System.out.println("i'm Pet");
   }
}
Mysal üçin, itleri - öý itini we köýnegi alalyň:
public class Dog extends Pet {

   public void introduce() {

       System.out.println("i'm Dog");
   }
}





public class Coyote extends WildAnimal {

   public void introduce() {

       System.out.println("i'm Coyote");
   }
}
Düşünişimizi aňsatlaşdyrmak üçin synplarymyz bilgeşleýin iň ýönekeýdir. Bu ýerde hakykatdanam meýdan gerek däl we bir usul ýeterlik. Aşakdaky kody işletmäge synanyşalyň:
public class Main {

   public static void main(String[] args) {

       Animal animal = new Pet();
       animal.introduce();
   }
}
Siziň pikiriňizçe konsola näme çykar? introduceSynp Petýa-da synp usuly işlärmi Animal? Okamagy dowam etdirmezden ozal beren jogabyňyzy esaslandyrmaga synanyşyň. Ine, netije! Men öý haýwany Näme üçin jogap beýle çykdy? Bu ýönekeý. Bizde ene-atanyň üýtgeýjisi we çaga obýekti bar. Writingazmak bilen:
Animal animal = new Pet();
Salgy görnüşini uzaltdykPet we obýektini üýtgeýjide sakladyk Animal. Ilkinji görnüşlerde bolşy ýaly, Java-da salgylanma görnüşlerini giňeltmek awtomatiki usulda amala aşyrylýar. Munuň üçin goşmaça kod ýazmagyň zerurlygy ýok. Indi ene-atanyň salgylanmasynda çaga obýekti bar we netijede bu usulyň çaga synpyna çagyrylýandygyny görýäris. Bu koduň näme üçin işleýändigine entek doly düşünmeseňiz, ony ýönekeý dilde ýazyň:
Животное животное = new ДомашнееЖивотное();
Munuň bilen baglanyşykly mesele ýok, şeýlemi? Munuň hakyky durmuşdygyny göz öňüne getiriň we bu ýagdaýda baglanyşyk “Haýwan” diýilýän ýönekeý kagyz belligi. Şeýle kagyzy alyp, haýsydyr bir haýwanyň ýakasyna daksaňyz, hemme zat gowy bolar. Islendik haýwan henizem haýwan! Ters proses, ýagny miras agajyny mirasdüşerlere geçirmek daralýar:
public class Main {

   public static void main(String[] args) {

       WildAnimal wildAnimal = new Coyote();

       Coyote coyote = (Coyote) wildAnimal;

       coyote.introduce();
   }
}
Görşüňiz ýaly, bu ýerde obýektimizi haýsy klasa gönükdirmek isleýändigimizi aç-açan görkezýäris. WildAnimalOzal Coyotemiras agajyndan aşak düşýän üýtgeýjimiz bardy . Düzüjiniň aç-açan görkezmesiz beýle amaldan ýüz öwürmezligi mantykly, ýöne gabygyň görnüşini görkezseňiz, hemme zat işlär. Salgy görnüşleriniň giňelmegi we gysylmagy - 2 Geliň, has gyzykly başga bir mysala seredeliň:
public class Main {

   public static void main(String[] args) {

       Pet pet = new Animal();//error!
   }
}
Düzediji ýalňyşlyk goýberýär! Munuň sebäbi näme? Hakykat, çaga üýtgeýänine ene-atanyň obýektini bellemäge synanyşýarsyňyz. Başgaça aýdylanda, muny etmek isleýärsiňiz:
ДомашнееЖивотное домашнееЖивотное = new Животное();
Maybeöne, belki, zyňjak bolýan görnüşimizi aç-açan görkezsek, üstünlik gazanarys? Sanlar işleýän ýaly, geliň synap göreliň! :)
public class Main {

   public static void main(String[] args) {

       Pet pet = (Pet) new Animal();
   }
}
"Esasy" java.lang.ClassCastException sapakdaky kadadan çykma: Haýwanlary haýwan säwligine taşlap bolmaz ! Düzediji bu gezek arz etmedi, ýöne netijede kadadan çykma aldyk. Munuň sebäbini eýýäm bilýäris: çaga üýtgeýänine ene-atanyň obýektini bellemäge synanyşýarys. Aslynda näme üçin beýle edip bolmaýar? Sebäbi haýwanlaryň hemmesi öý haýwanlary däl. Bir obýekt döretdiňiz Animalwe ony üýtgeýjä bellemäge synanyşýarsyňyz Pet. , Öne, mysal üçin, koýot öý haýwanlarydyr Animal, ýöne beýle däl . PetBaşgaça aýdylanda, ýazanyňyzda:
Pet pet = (Pet) new Animal();
new Animal()Islendik haýwan şol ýerde bolup biler we öýde bolmaly däl! Elbetde, üýtgeýjiňiz Pet petdiňe öý haýwanlaryny (we olaryň nesillerini) saklamak üçin amatly, hemmeler üçin däl. Şonuň üçin şeýle ýagdaýlar üçin Java-da aýratyn kadadan çykma döredildi - ClassCastExceptionsapaklary goýbermekde ýalňyşlyk. Has düşnükli etmek üçin ýene bir gezek aýdalyň. Ene-atanyň üýtgeýjisi (salgylanma) nesil synpynyň obýektini görkezip biler:
public class Main {

   public static void main(String[] args) {

       Pet pet =  new Pet();
       Animal animal = pet;

       Pet pet2 = (Pet) animal;
       pet2.introduce();
   }
}
Mysal üçin, bu ýerde hiç hili problema bolmaz. PetBaglanyşyk bilen görkezilen obýektimiz bar Pet. Soňra täze baglanyşyk şol bir obýekti görkezip başlady Animal. animalOndan soň öwrüleris Pet. Wayogsa-da, näme üçin beýle etdik? Geçen gezek kadadan çykdyk! Sebäbi bu gezek asyl obýektimiz Pet pet!
Pet pet =  new Pet();
Öňki mysalda bu bir obýektdi Animal:
Pet pet = (Pet) new Animal();
Nesil üýtgeýjisine ata-baba obýektini belläp bilmersiňiz. Munuň tersine, edip bilersiňiz.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION