JavaRush /Блоги Java /Random-TG /Таъин ва оғозсозӣ дар Java
Viacheslav
Сатҳи

Таъин ва оғозсозӣ дар Java

Дар гурӯҳ нашр шудааст

Муқаддима

Мақсади асосии барномаҳои компютерӣ коркарди додаҳо мебошад. Барои коркарди маълумот шумо бояд онро бо ягон роҳ нигоҳ доред. Ман пешниҳод мекунам, ки фаҳмем, ки маълумот чӣ гуна нигоҳ дошта мешавад.
Таъин ва оғозёбӣ дар Java - 1

Тағйирёбандаҳо

Тағирёбандаҳо контейнерҳое мебошанд, ки ҳама гуна маълумотро нигоҳ медоранд. Биёед ба дастури расмии Oracle назар кунем: Эълон кардани тағирёбандаҳои аъзо . Мувофиқи ин дастур, якчанд намуди тағирёбандаҳо мавҷуданд:
  • Майдонҳо : тағирёбандаҳои дар синф эълоншуда;
  • Тағйирёбандаҳои маҳаллӣ : тағирёбандаҳо дар усул ё блоки code;
  • Параметрҳо : тағирёбандаҳо дар эъломияи усул (дар имзо).
Ҳама тағирёбандаҳо бояд намуди тағирёбанда ва номи тағирёбанда дошта бошанд.
  • Навъи тағирёбанда нишон медиҳад, ки тағирёбанда кадом маълумотро нишон медиҳад (яъне кадом маълумотро нигоҳ дошта метавонад). Тавре ки мо медонем, навъи тағирёбанда метавонад ибтидоӣ (примитивҳо ) ё an object бошад , на ибтидоӣ (Ғайри ибтидоӣ). Бо тағирёбандаҳои an object, навъи онҳо аз ҷониби як синфи мушаххас тавсиф карда мешавад.
  • Номи тағирёбанда бояд бо ҳарфҳои шутур хурд бошад. Шумо метавонед бештар дар бораи номгузорӣ дар " Variables:Naming " хонед.
Инчунин, агар тағирёбандаи сатҳи синф, яъне. майдони синф аст, барои он тағирдиҳандаи дастрасӣ муайян кардан мумкин аст. Барои тафсилоти бештар ба назорати дастрасӣ ба аъзоёни синф нигаред .

Эъломияи тағирёбанда

Ҳамин тавр, мо дар хотир дорем, ки тағирёбанда чист. Барои оғоз кардани кор бо тағирёбанда, шумо бояд онро эълон кунед. Аввалан, биёед як тағирёбандаи маҳаллиро бубинем. Ба ҷои IDE, барои роҳат, мо ҳалли онлайнро аз tutorialspoint истифода хоҳем кард: Online IDE . Биёед ин барномаи оддиро дар IDE-и онлайни онҳо иҷро кунем:
public class HelloWorld{
    public static void main(String []args){
        int number;
        System.out.println(number);
    }
}
Ҳамин тавр, тавре ки шумо мебинед, мо як тағирёбандаи маҳаллиро бо ном numberва навъи эълон кардем int. Мо тугмаи "Иҷро кардан" -ро пахш мекунем ва хатогиро мегирем:
HelloWorld.java:5: error: variable number might not have been initialized
        System.out.println(number);
Чӣ гап шуд? Мо тағирёбанда эълон кардем, аммо арзиши онро оғоз накардем. Бояд қайд кард, ки ин хато на дар вақти иҷро (яъне, на дар Runtime), балки дар вақти тартибдиҳӣ рух додааст. Компилятори интеллектуалӣ тафтиш кард, ки оё тағирёбандаи маҳаллӣ пеш аз дастрасӣ ба он оғоз карда мешавад ё не. Аз ин рӯ, гуфтаҳои зерин аз ин бармеоянд:
  • Тағирёбандаҳои маҳаллӣ бояд танҳо пас аз оғоз кардани онҳо дастрас карда шаванд;
  • Тағйирёбандаҳои маҳаллӣ арзишҳои пешфарз надоранд;
  • Қиматҳои тағирёбандаҳои маҳаллӣ дар вақти тартибдиҳӣ тафтиш карда мешаванд.
Ҳамин тавр, ба мо гуфта мешавад, ки тағирёбанда бояд оғоз карда шавад. Оғоз кардани тағирёбанда ин таъин кардани арзиш ба тағирёбанда мебошад. Пас биёед бифаҳмем, ки ин чист ва чаро.

Оғоз кардани тағирёбандаи маҳаллӣ

Оғоз кардани тағирёбандаҳо яке аз мушкилтарин мавзӯъҳо дар Java аст, зеро... бо кор бо хотира, татбиқи JVM, мушаххасоти JVM ва дигар чизҳои якхела даҳшатнок ва душвор алоқаманд аст. Аммо шумо метавонед кӯшиш кунед, ки ҳадди аққал то андозае онро фаҳмед. Биёед аз содда ба мураккаб гузарем. Барои оғоз кардани тағирёбанда, мо оператори таъинотро истифода мебарем ва сатрро дар codeи қаблии худ тағир медиҳем:
int number = 2;
Дар ин хосият, ягон хатогӣ вуҷуд надорад ва арзиш дар экран нишон дода мешавад. Дар ин ҳолат чӣ мешавад? Биёед кӯшиш кунем, ки фикр кунем. Агар мо хоҳем, ки ба тағирёбанда арзиш таъин кунем, пас мо мехоҳем, ки он тағирёбанда арзишро нигоҳ дорад. Маълум мешавад, ки арзиш бояд дар ҷое нигоҳ дошта шавад, аммо дар куҷо? Дар диск? Аммо ин хеле суст аст ва метавонад барои мо маҳдудият ҷорӣ кунад. Маълум мешавад, ки ягона ҷойе, ки мо метавонем маълумотро "дар ин ҷо ва ҳоло" зуд ва самаранок нигоҳ дорем, хотира аст. Ин маънои онро дорад, ки мо бояд дар хотира каме ҷой ҷудо кунем. Ин дуруст аст. Вақте ки тағирёбанда оғоз карда мешавад, барои он дар хотирае, ки ба раванди java ҷудо карда шудааст, ҷой ҷудо карда мешавад, ки дар доираи он барномаи мо иҷро карда мешавад. Хотираи ба раванди java ҷудошуда ба якчанд минтақа ё минтақаҳо тақсим карда мешавад. Кадоме аз онҳо фосила ҷудо мекунад, вобаста ба кадом навъи тағирёбанда эълон шудааст. Хотира ба қисмҳои зерин тақсим мешавад: Heap, Stack ва Non-Heap . Биёед бо хотираи стек оғоз кунем. Стек ҳамчун стек тарҷума мешавад (масалан, стек китобҳо). Ин сохтори додаҳои LIFO (охирин ворид, аввал баромад) мебошад. Яъне мисли як даста китоб. Вақте ки мо китобҳоро ба он илова мекунем, мо онҳоро ба боло мегузорем ва вақте ки мо онҳоро мегирем, болоро мегирем (яъне китобе, ки ба наздикӣ илова карда шудааст). Ҳамин тавр, мо барномаи худро оғоз мекунем. Тавре ки мо медонем, барномаи Java аз ҷониби JVM, яъне мошини виртуалии Java иҷро карда мешавад. JVM бояд донад, ки иҷрои барнома дар куҷо бояд оғоз шавад. Барои ин мо усули асосиро эълон мекунем, ки онро "нуқтаи воридшавӣ" меноманд. Барои иҷро дар JVM риштаи асосӣ (Thread) сохта мешавад. Вақте ки ришта сохта мешавад, он стеки худро дар хотира ҷудо мекунад. Ин стек аз чаҳорчӯба иборат аст. Вақте ки ҳар як усули нав дар як ришта иҷро карда мешавад, барои он чаҳорчӯбаи нав ҷудо карда мешавад ва ба болои стек илова карда мешавад (мисли китоби нав дар як стек китобҳо). Ин чаҳорчӯба дорои истинодҳо ба an objectҳо ва намудҳои ибтидоӣ мебошад. Бале, ҳа, int мо дар стек нигоҳ дошта мешавад, зеро... int як навъи ибтидоӣ аст. Пеш аз ҷудо кардани чаҳорчӯба, JVM бояд фаҳмад, ки дар он ҷо чӣ захира кардан лозим аст. Маҳз аз ҳамин сабаб, мо хатогиро мегирем "тағйирёбанда шояд оғоз нашуда бошад", зеро агар он оғоз карда нашавад, JVM наметавонад стекро барои мо омода кунад. Аз ин рӯ, ҳангоми тартиб додани барнома, як компилятори оқил ба мо кӯмак мекунад, ки хатогиҳо ва шикастани ҳама чизро пешгирӣ кунем. (!) Барои возеҳӣ, ман як мақолаи олиҷанобро тавсия медиҳам : “ Java Stack and Heap: Омӯзиши тақсимоти хотираи Java ”. Он ба видеои якхела олӣ пайванд медиҳад:
Пас аз ба охир расидани иҷрои метод, чаҳорчӯбаҳое, ки барои ин усулҳо ҷудо карда шудаанд, аз стеки ришта нест карда мешаванд ва дар баробари онҳо хотираи барои ин чаҳорчӯба ҷудошуда бо тамоми маълумот тоза карда мешавад.

Оғоз кардани тағирёбандаҳои an objectи маҳаллӣ

Биёед рамзи худро боз ба каме душвортар иваз кунем:
public class HelloWorld{

    private int number = 2;

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

}
Дар ин ҷо чӣ мешавад? Биёед боз дар ин бора сухан ронем. JVM медонад, ки он бояд барномаро аз куҷо иҷро кунад, яъне. усули асосиро мебинад. Он ришта эҷод мекунад ва хотираро барои он ҷудо мекунад (охир, ришта бояд маълумотеро, ки барои иҷро лозим аст, дар ҷое нигоҳ дорад). Дар ин ришта барои усули асосӣ чаҳорчӯба ҷудо карда шудааст. Минбаъд мо an objectи HelloWorld эҷод мекунем. Ин an object дигар на дар стек, балки дар теппа сохта мешавад. Чунки an object навъи ибтидоӣ нест, балки навъи an object аст. Ва стек танҳо истинод ба an objectро дар теппа нигоҳ медорад (мо бояд бо ягон роҳ ба ин an object дастрасӣ пайдо кунем). Минбаъд дар стеки усули асосӣ чаҳорчӯбаҳо барои иҷрои усули println ҷудо карда мешаванд. Пас аз иҷрои усули асосӣ, ҳамаи чаҳорчӯбаҳо нест карда мешаванд. Агар чаҳорчӯба нобуд карда шавад, ҳама маълумот нобуд карда мешавад. Объекти an object фавран нест карда намешавад. Аввалан, истинод ба он нест карда мешавад ва ба ин васила дигар ҳеҷ кас ба an objectи an object муроҷиат намекунад ва дастрасӣ ба ин an object дар хотира дигар имконнопазир хоҳад буд. JVM интеллектуалӣ барои ин механизми худро дорад - як коллектори ахлот (ҷамъоварии ахлот ё GC барои кӯтоҳ). Он гоҳ аз хотира an objectҳоеро, ки ҳеҷ каси дигар истинод намекунад, хориҷ мекунад. Ин раванд боз дар истиноди дар боло овардашуда тасвир шудааст. Ҳатто як видео бо шарҳ вуҷуд дорад.

Оғоз кардани майдонҳо

Оғозсозии майдонҳои дар синф нишондодашуда вобаста ба статикӣ ё набудани майдон ба таври махсус сурат мегирад. Агар майдон калимаи калидии static дошта бошад, пас ин майдон ба худи синф ишора мекунад ва агар калимаи static муайян нашуда бошад, пас ин майдон ба мисоли синф ишора мекунад. Биёед инро бо мисол дида бароем:
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);
    }
}
Дар ин мисол, майдонҳо дар вақтҳои гуногун оғоз карда мешаванд. Майдони рақам пас аз сохтани an objectи синфи HelloWorld оғоз карда мешавад. Аммо майдони ҳисоб вақте оғоз мешавад, ки синф аз ҷониби мошини виртуалии Java бор карда мешавад. Боркунии синф як мавзӯи алоҳида аст, бинобар ин мо онро дар ин ҷо омехта намекунем. Фақат донистан лозим аст, ки тағирёбандаҳои статикӣ вақте оғоз мешаванд, ки синф дар вақти корӣ маълум мешавад. Дар ин ҷо чизи дигар муҳимтар аст ва шумо инро аллакай пай бурдаед. Мо арзишро дар ҳеҷ ҷо муайян накардаем, аммо он кор мекунад. Ва дар ҳақиқат. Тағирёбандаҳое, ки майдонҳо мебошанд, агар онҳо арзиши муайян надошта бошанд, онҳо бо арзиши пешфарз оғоз карда мешаванд. Барои арзишҳои ададӣ, ин барои рақамҳои нуқтаи шинокунанда 0 ё 0,0 аст. Барои булӣ ин нодуруст аст. Ва барои ҳама тағирёбандаҳои навъи an object, арзиш сифр хоҳад буд (мо дар ин бора баъдтар сӯҳбат хоҳем кард). Чунин ба назар мерасад, ки чаро ин тавр аст? Аммо азбаски an objectҳо дар Heap (дар теппа) сохта шудаанд. Кор бо ин минтақа дар Runtime анҷом дода мешавад. Ва мо метавонем ин тағирёбандаҳоро дар вақти корӣ оғоз кунем, баръакси стек, ки хотираи онҳо бояд пеш аз иҷро омода карда шавад. Хотира дар Java ҳамин тавр кор мекунад. Аммо дар ин ҷо як хусусияти дигар вуҷуд дорад. Ин порчаи хурд ба гӯшаҳои гуногуни хотира таъсир мерасонад. Тавре ки мо дар хотир дорем, чаҳорчӯба дар хотираи Stack барои усули асосӣ ҷудо карда мешавад. Ин чаҳорчӯба истинод ба an objectро дар хотираи Heap нигоҳ медорад. Аммо ҳисоб дар куҷо нигоҳ дошта мешавад? Тавре ки мо дар хотир дорем, ин тағирёбанда фавран пеш аз сохтани an object дар теппа оғоз карда мешавад. Ин саволи воқеан душвор аст. Пеш аз Java 8, як минтақаи хотира бо номи PERMGEN вуҷуд дошт. Аз Java 8 сар карда, ин минтақа тағйир ёфт ва METASPACE ном дорад. Аслан, тағирёбандаҳои статикӣ қисми таърифи синф мебошанд, яъне. метамаълумоти он. Аз ин рӯ, мантиқист, ки он дар анбори метамаълумотҳо, METASPACE нигоҳ дошта мешавад. MetaSpace ба ҳамон минтақаи хотираи ғайридавлатӣ тааллуқ дорад ва як қисми он мебошад. Инчунин бояд ба назар гирифт, ки тартиби эълон кардани тағирёбандаҳо ба назар гирифта мешавад. Масалан, дар ин code хатогӣ вуҷуд дорад:
public class HelloWorld{

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

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

}

Чӣ нол аст

Тавре ки дар боло зикр гардид, тағирёбандаҳои намудҳои an object, агар онҳо майдонҳои синф бошанд, ба арзишҳои пешфарз оғоз карда мешаванд ва он арзиши пешфарз нул аст. Аммо дар Java null чист? Аввалин чизе, ки бояд дар хотир дошт, ин аст, ки намудҳои ибтидоӣ наметавонанд сифр бошанд. Ва ҳама аз он сабаб, ки null истинод махсус аст, ки дар ҳеҷ ҷо, ба ягон an object ишора намекунад. Аз ин рӯ, танҳо як тағирёбандаи an object метавонад сифр бошад. Чизи дуюме, ки барои фаҳмидан муҳим аст, ин аст, ки null истинод аст. Ман истинод мекунам, ки вазни онҳо низ доранд. Дар ин мавзӯъ шумо метавонед саволро дар бораи stackoverflow хонед: " Оё тағирёбандаи нул дар хотира ҷой талаб мекунад ?".

Блокҳои ибтидоӣ

Ҳангоми баррасии оғозкунии тағирёбандаҳо, ба назар нагирифтани блокҳои ибтидоӣ гуноҳ мебуд. Чунин ба назар мерасад:
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();
    }

}
Тартиби баромад чунин хоҳад буд: блоки статикӣ, блок, Конструктор. Тавре ки мо мебинем, блокҳои ибтидоӣ пеш аз конструктор иҷро карда мешаванд. Ва баъзан ин метавонад як воситаи муносиби оғозёбӣ бошад.

Хулоса

Умедворам, ки ин шарҳи кӯтоҳ тавонист дар бораи он ки чӣ тавр кор мекунад ва чаро фаҳмиш диҳад. #Вячеслав
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION