JavaRush /Java Blog /Random-TK /Java-da bellemek we başlangyç
Viacheslav
Dereje

Java-da bellemek we başlangyç

Toparda çap edildi

Giriş

Kompýuter programmalarynyň esasy maksady maglumatlary gaýtadan işlemekdir. Maglumatlary gaýtadan işlemek üçin ony nädip saklamaly. Maglumatlaryň nähili saklanýandygyna düşünmegi teklip edýärin.
Java-da bellemek we başlangyç - 1

Üýtgeýjiler

Üýtgeýjiler islendik maglumatlary saklaýan gaplardyr. Oracle-dan resmi gollanma seredeliň: Agza üýtgeýänlerini yglan etmek . Bu gollanma görä üýtgeýjileriň birnäçe görnüşi bar:
  • Meýdanlar : synpda yglan edilen üýtgeýjiler;
  • Varierli üýtgeýjiler : usul ýa-da kod blokundaky üýtgeýjiler;
  • Parametrler : usul deklarasiýasyndaky üýtgeýjiler (golda).
Varihli üýtgeýänleriň üýtgeýän görnüşi we üýtgeýän ady bolmaly.
  • Üýtgeýjiniň görnüşi üýtgeýjiniň haýsy maglumatlary aňladýandygyny görkezýär (ýagny haýsy maglumatlary saklap bilýär). Bilşimiz ýaly üýtgeýjiniň görnüşi başlangyç (primitiw primitives ) ýa- da başlangyç däl (primitiw däl) bolup biler. Obýekt üýtgeýjileri bilen olaryň görnüşi belli bir synp tarapyndan beýan edilýär.
  • Üýtgeýän adyň düýe ýagdaýynda kiçi harp bolmaly. Atlandyrmak barada has giňişleýin " Üýtgeýjiler: Atlandyrmak " -da okap bilersiňiz .
Şeýle hem, synp derejesiniň üýtgeýjisi bolsa, ýagny synp meýdançasy, oňa giriş üýtgediji kesgitlenip bilner. Has giňişleýin maglumat üçin synp agzalaryna girişi dolandyrmak .

Üýtgeýän beýannama

Şeýlelik bilen, üýtgeýjiniň nämedigini ýadymyzda saklaýarys. Üýtgeýji bilen işe başlamak üçin ony yglan etmeli. Ilki bilen ýerli üýtgeýjä seredeliň. Amatlylyk üçin IDE-iň ýerine, onlaýn çözgüdi tutorialspoint: Online IDE ulanarys . Geliň, bu ýönekeý programmany onlaýn IDE-de işledeliň:
public class HelloWorld{
    public static void main(String []args){
        int number;
        System.out.println(number);
    }
}
Görşüňiz ýaly, ady numberwe görnüşi bilen ýerli üýtgeýjini yglan etdik int. "Execute" düwmesine basýarys we ýalňyşlygy alýarys:
HelloWorld.java:5: error: variable number might not have been initialized
        System.out.println(number);
Näme boldy? Üýtgeýjini yglan etdik, ýöne onuň bahasyny başlatmadyk. Bu ýalňyşlygyň ýerine ýetiriş wagtynda (ýagny, iş wagty däl), ýöne düzüliş wagtynda ýüze çykandygyny bellemelidiris. Akylly düzüji ýerli üýtgeýjä girmezden ozal başlajakdygyny ýa-da ýokdugyny barlady. Şonuň üçin şu sözlerden aşakdaky sözler gelýär:
  • Varierli üýtgeýjilere diňe işe girizilenden soň girmeli;
  • Varierli üýtgeýjileriň başlangyç bahalary ýok;
  • Varierli üýtgeýänleriň bahalary düzülende barlanýar.
Şeýlelik bilen, üýtgeýjiniň başlangyç edilmelidigi aýdylýar. Üýtgeýjini başlamak, üýtgeýjä baha bellemekdir. Geliň, onuň nämedigini we sebäbini öwreneliň.

Aerli üýtgeýjini başlamak

Üýtgeýjileri başlamak Java-da iň kyn mowzuklaryň biri, sebäbi ... ýat bilen işlemek, JVM durmuşa geçirmek, JVM spesifikasiýasy we beýleki deň derejede gorkunç we kyn zatlar bilen gaty ýakyn baglanyşyklydyr. Iň bolmanda belli bir derejede muny anyklamaga synanyşyp bilersiňiz. Simpleönekeýden çylşyrymlylyga geçeliň. Üýtgeýjini işe girizmek üçin, belleme operatoryny ulanarys we öňki kodumyzdaky setiri üýtgederis:
int number = 2;
Bu opsiýada ýalňyşlyklar bolmaz we baha ekranda görkeziler. Bu ýagdaýda näme bolýar? Pikirlenmäge synanyşalyň. Bir üýtgeýjä baha bellemek islesek, şol üýtgeýjiniň bir bahany saklamagyny isleýäris. Görnüşi ýaly, baha bir ýerde saklanmalydyr, ýöne nirede? Diskde? Emma bu gaty haýal we bize çäklendirmeler girizip biler. Görnüşi ýaly, maglumatlary “şu wagt we şu wagt” çalt we netijeli saklap bilýän ýeke-täk ýerimiz ýat. Diýmek, ýatda biraz ýer bölmeli. Bu hakykat. Üýtgeýji işe girizilende, programmamyzyň ýerine ýetiriljek java prosesine bölünen ýatda oňa ýer bölüner. Java prosesine bölünen ýat birnäçe sebite ýa-da zona bölünýär. Olaryň haýsysy ýer bölüp berjekdigi üýtgeýjiniň haýsy görnüşine yglan edilendigine baglydyr. Oryat aşakdaky bölümlere bölünýär: Top, üýşmek we üýşmek däl . Stack ýadyndan başlalyň. Stack stak hökmünde terjime edilýär (mysal üçin, kitaplar toplumy). Bu LIFO (Iň soňky, ilki bilen) maglumat gurluşy. .Agny, bir topar kitap ýaly. Oňa kitap goşanymyzda, üstünde goýýarys we alyp gidenimizde iň ýokarkysyny alýarys (ýagny ýaňy-ýakynda goşulan kitap). Şeýlelikde, programmamyza başlaýarys. Bilşimiz ýaly, Java programmasy JVM, ýagny Java wirtual maşyn tarapyndan ýerine ýetirilýär. JVM programmanyň ýerine ýetirilişiniň nireden başlamalydygyny bilmelidir. Munuň üçin “giriş nokady” diýilýän esasy usuly yglan edýäris. JVM-de ýerine ýetirmek üçin esasy sapak (Sapak) döredilýär. Bir sapak döredilende, ýatda saklanýar. Bu stakan çarçuwalardan durýar. Her täze usul sapakda ýerine ýetirilende, onuň üçin täze çarçuwa bölünip, stakanyň ýokarsyna goşular (kitaplar toplumyndaky täze kitap ýaly). Bu çarçuwada obýektlere we başlangyç görnüşlere salgylanmalar bolar. Hawa, hawa, intimiz stakada saklanar, sebäbi ... int başlangyç görnüşdir. Çarçuwany bölmezden ozal, JVM ol ýerde nämäni tygşytlamalydygyna düşünmeli. Şol sebäpden, “üýtgeýjiniň başlangyjy bolmadyk bolmagy mümkin” ýalňyşyny alarys, sebäbi başlamadyk bolsa, JVM biziň üçin taýak taýýarlap bilmez. Şonuň üçin bir programma düzülende akylly düzüji ýalňyşlyklardan we hemme zady bozmakdan saklanar. (!) Has düşnükli bolmak üçin, “ Java Stack and Heap: Java Memory Allocation Tutorial ” atly super dýuper makalany maslahat berýärin . Deň derejede ajaýyp wideo bilen baglanyşýar:
Usulyň ýerine ýetirilişi tamamlanandan soň, bu usullar üçin bölünip berlen çarçuwalar sapagyň bukjasyndan öçüriler we olar bilen birlikde ähli maglumatlar bilen bu ramka üçin bölünen ýat arassalanar.

Localerli obýekt üýtgeýjilerini başlamak

Geliň, kodumyzy ýene birneme kynlaşdyralyň:
public class HelloWorld{

    private int number = 2;

    public static void main(String []args){
        HelloWorld object = new HelloWorld();
        System.out.println(object.number);
    }

}
Bu ýerde näme bolar? Geliň, bu hakda ýene gürleşeliň. JVM programmany nireden ýerine ýetirmelidigini bilýär, ýagny esasy usuly görýär. Bir sapak döredýär we onuň üçin ýady bölýär (ahyrsoňy, bir sapak ýerine ýetirmek üçin zerur maglumatlary bir ýerde saklamaly). Bu sapakda esasy usul üçin çarçuwa bölünip berilýär. Soň bolsa HelloWorld obýektini döredýäris. Bu obýekt indi taýakda däl-de, üýşmekde döredildi. Sebäbi obýekt başlangyç görnüş däl, obýekt görnüşi. Ackygyndy diňe üýşmeleňdäki obýekte salgylanmany saklar (nämüçindir bu obýekte girmeli). Ondan soň, esasy usulyň içinde, println usulyny ýerine ýetirmek üçin çarçuwalar bölüner. Esasy usuly ýerine ýetirensoň, ähli ramkalar ýok ediler. Çarçuwa ýok edilse, ähli maglumatlar ýok ediler. Obýekt obýekti derrew ýok edilmez. Ilki bilen, oňa salgylanma ýok ediler we şeýlelik bilen hiç kim obýekt obýektine ýüz tutmaz we bu obýektiň ýadyna girmek indi mümkin bolmaz. Akylly JVM-iň munuň üçin öz mehanizmi bar - zibil ýygnaýjy (gysgaça zibil ýygnaýjy ýa-da GC). Soňra başga hiç kimiň görkezmeýän ýat obýektlerinden aýyrýar. Bu amal ýokarda görkezilen baglanyşykda ýene beýan edildi. Hatda düşündirişli wideo hem bar.

Meýdanlary başlamak

Bir synpda görkezilen meýdanlaryň başlangyjy, meýdanyň statikdigine ýa-da ýokdugyna baglylykda aýratyn görnüşde ýüze çykýar. Bir meýdanda statik açar söz bar bolsa, bu meýdan synpyň özüne degişlidir we statik sözi kesgitlenmedik bolsa, bu meýdan synpyň mysalyna degişlidir. Muňa mysal bilen seredeliň:
public class HelloWorld{
    private int number;
    private static int count;

    public static void main(String []args){
        HelloWorld object = new HelloWorld();
        System.out.println(object.number);
    }
}
Bu mysalda meýdanlar dürli wagtda başlaýar. “HelloWorld” synp obýekti döredilenden soň san meýdany başlar. Emma synp Java wirtual enjamy ýüklenende hasaplaýyş meýdançasy başlar. Synp ýüklemek aýratyn mowzuk, şonuň üçin bu ýerde garyşdyrmarys. Statik üýtgeýänleriň synpyň iş wagty belli bolanda başlanýandygyny bilmek gerek. Bu ýerde başga bir zat has möhümdir we muny eýýäm gördüňiz. Bahany hiç ýerde görkezmedik, ýöne işleýär. Hakykatdanam. Meýdan bolan üýtgeýjiler, görkezilen bahasy ýok bolsa, başlangyç bahasy bilen başlaýar. San bahalary üçin ýüzýän nokatlar üçin 0 ýa-da 0.0. Boolean üçin bu ýalan. Objecthli obýekt görnüşindäki üýtgeýjiler üçin bahanyň güýji ýok bolar (bu barada soňrak gürleşeris). Görnüşi ýaly, näme üçin beýle? Objectsöne obýektler üýşmeleňde (üýşmekde) ýaradylandygy sebäpli. Bu ugur bilen iş Iş wagty ýerine ýetirilýär. Bu üýtgeýjileri iş wagtyndan başlap bileris, ýadyň ýerine ýetirilmeginden öň taýýar bolmaly ýygyndydan tapawutlylykda. Java-da ýat şeýle işleýär. Emma bu ýerde ýene bir aýratynlyk bar. Bu kiçijik eser ýadyň dürli burçlaryna degýär. .Adymyzda bolsa, esasy usul üçin Stack ýadynda çarçuwa bölünýär. Bu ramka, Heap ýadynda bir obýekte salgylanmany saklaýar. Emma hasap nirede saklanýar? .Adymyzda bolsa, bu üýtgeýji obýekt üýşmekde döredilmänkä derrew başlaýar. Bu hakykatdanam kyn sorag. Java 8-den öň PERMGEN atly ýat meýdany bardy. Java 8-den başlap, bu ýer üýtgedi we METASPACE diýilýär. Aslynda, statiki üýtgeýjiler synp kesgitlemesiniň bir bölegidir. metadata. Şonuň üçin metadata ammarynda, METASPACE-de saklanmagy mantykly. MetaSpace şol bir Heap däl ýat meýdanyna degişlidir we onuň bir bölegidir. Üýtgeýjileriň yglan edilen tertibiniň hem göz öňünde tutulýandygyny göz öňünde tutmak möhümdir. Mysal üçin, bu kodda ýalňyşlyk bar:
public class HelloWorld{

    private static int b = a;
    private static int a = 1;

    public static void main(String []args){
        System.out.println(b);
    }

}

Nul

Aboveokarda aýdylyşy ýaly, obýekt görnüşleriniň üýtgeýjileri, eger synpyň meýdanlary bolsa, başlangyç bahalara başlanýar we deslapky baha ýok. Javaöne Java-da näme boş? Ilki bilen ýatda saklamaly zat, başlangyç görnüşleriň güýji ýok bolup biler. Bularyň hemmesi, null hiç ýere, haýsydyr bir obýekte salgylanmaýan ýörite salgylanma. Şonuň üçin diňe bir obýekt üýtgeýjisi null bolup biler. Düşünmeli möhüm zat, null salgylanma. Olaryň agramy hem bar. Bu mowzukda, “ null üýtgeýjiniň ýadynda ýer talap edýärmi ?” Diýen soragy okap bilersiňiz .

Başlangyç bloklary

Üýtgeýjileriň başlangyjy göz öňünde tutulanda, başlangyç bloklaryny göz öňünde tutmazlyk günä bolar. Görnüşi ýaly:
public class HelloWorld{

    static {
        System.out.println("static block");
    }

    {
        System.out.println("block");
    }

    public HelloWorld () {
        System.out.println("Constructor");
    }

    public static void main(String []args){
        HelloWorld obj = new HelloWorld();
    }

}
Çykyş tertibi: statiki blok, blok, konstruktor. Görşümiz ýaly, başlangyç bloklary konstruktoryň öňünde ýerine ýetirilýär. Kämahal bu başlangyç üçin amatly serişde bolup biler.

Netije

Bu gysgaça syn, onuň nähili işleýändigi we näme üçin edilýändigi barada birneme düşünje berip biler diýip umyt edýärin. # Wiaçeslaw
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION