CodeGym /Kurslar /JAVA 25 SELF /Obyektin ilkinləşdirilməsi: ilkinləşdirmə ardıcıllığı

Obyektin ilkinləşdirilməsi: ilkinləşdirmə ardıcıllığı

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

1. Java-da obyektin ilkinləşdirilmə ardıcıllığı: əvvəl kimdir, axırda kim?

Java-da obyekt yaratmaq — bu, sadəcə “yaddaş ayırıb ora dəyərləri yazmaq” deyil. Bu, dəqiq ardıcıllığı olan bütöv bir rituallı prosesdir. İlkinləşdirmə prosesini raketin buraxılışı kimi təsəvvür etsək, hər mərhələnin öz sərt yeri var.

Siz belə yazanda:

Person vasya = new Person("Vasya", 30);

Java aşağıdakı addımları yerinə yetirir:

  1. Obyekt üçün yaddaş ayırır və bütün sahələrə susmaya görə dəyərlər təyin edir.
  2. Sahələrin açıq ilkinləşdirilməsini icra edir (əgər dəyəri elanda göstərmisinizsə).
  3. Bütün qeyri-statik (adi) ilkinləşdirmə bloklarını — sinifdə yazıldıqları ardıcıllıqla — icra edir.
  4. new vasitəsilə çağırdığınız konstruktorun bədənini icra edir.

Gəlin hər addımı ətraflı nəzərdən keçirək.

2. Sahələrin ilkinləşdirilməsi

Susmaya görə (defolt) dəyərlər

Obyekt yeni yaradıldıqda (siz hələ heç nəyi açıq şəkildə təyin etməmişdən əvvəl) onun bütün sahələri susmaya görə dəyərlər alır:

Sahənin tipi Susmaya görə dəyər
int, short, byte, long
0
float, double
0.0
boolean
false
char
'\u0000' (nul simvolu)
İstinad tipləri (String, digər obyektlər)
null

Açıq ilkinləşdirmə

Əgər siz sahəni elan edərkən ona dərhal dəyər verirsinizsə, bu dəyər susmaya görə dəyərlərdən sonra, lakin konstruktor icra edilməzdən əvvəl təyin olunacaq.

public class Person {
    private String name = "Adsız";
    private int age = 18;
}

Əgər obyekti boş konstruktorla yaratsanız, bu dəyərlər qalacaq. Parametrlərlə konstruktor vasitəsilə yaratsanız — çox güman ki, onlar dəyişdiriləcək.

3. İlkinləşdirmə blokları: nə üçün lazımdır və necə işləyir

Java-da qeyri-statik (adi) ilkinləşdirmə blokları elan etmək olar. Onlar hər dəfə obyekt yaradılarkən, sahələr ilkinləşdirildikdən dərhal sonra, lakin konstruktoradək icra olunur.

Sintaksis:

public class Person {
    {
        System.out.println("Qeyri-statik ilkinləşdirmə bloku icra olunur!");
    }
}

Əgər sinifdə belə bir neçə blok varsa, onlar yazıldıqları ardıcıllıqla icra olunurlar.

Bir neçə blokla nümunə

public class Person {
    private String name = "Adsız";

    {
        System.out.println("Blok 1: name = " + name);
        name = "Tapmaca";
    }

    {
        System.out.println("Blok 2: name = " + name);
    }

    public Person() {
        System.out.println("Konstruktor: name = " + name);
    }
}

Obyekt yaratsaq:

Person p = new Person();

Çıxış belə olacaq:

Blok 1: name = Adsız
Blok 2: name = Tapmaca
Konstruktor: name = Tapmaca

İlkinləşdirmə blokları nə üçün lazımdır?

Reallıqda ilkinləşdirmə bloklarından nadir hallarda istifadə olunur. Adətən blokda edilə bilən hər şeyi ya sahənin elanında, ya da konstruktor daxilində etmək olar. Amma bəzən (məsələn, bir neçə konstruktorunuz varsa və ilkinləşdirmə məntiqinin bir hissəsi hamısı üçün ümumi olmalıdırsa) ilkinləşdirmə blokları əlverişli ola bilər.

4. Konstruktor: ilkinləşdirmənin son akkordu

Bütün sahələr dəyərlərini aldıqdan (susmaya görə və ya açıq şəkildə) və bütün ilkinləşdirmə blokları işlədikdən sonra konstruktor çağırılır — məhz new-dən sonra göstərdiyiniz o konstruktor.

Konstruktor daxilində adətən sahələrə yekun dəyərlər verilir, parametrlər qəbul olunur və giriş verilənlərindən asılı olan digər ilkinləşdirmə aparılır.

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        System.out.println("Konstruktor: name = " + name + ", age = " + age);
        this.name = name;
        this.age = age;
    }
}

5. İlkinləşdirmənin tam ardıcıllığının nümayişi

Gəlin ilkinləşdirmənin hansı ardıcıllıqla baş verdiyini aydın şəkildə göstərən bir sinif yazaq.

public class Person {
    private String name = "Adsız";
    private int age = 18;

    {
        System.out.println("İlkinləşdirmə bloku: name = " + name + ", age = " + age);
        age = 21;
    }

    public Person() {
        System.out.println("Parametrlərsiz konstruktor: name = " + name + ", age = " + age);
    }

    public Person(String name, int age) {
        System.out.println("Parametrlərlə konstruktor: name = " + name + ", age = " + age);
        this.name = name;
        this.age = age;
    }

    public void printInfo() {
        System.out.println("Person: name = " + name + ", age = " + age);
    }
}

Və indi əsas sinfimizdə (məsələn, Main):

public class Main {
    public static void main(String[] args) {
        System.out.println("Obyekt p1 yaradırıq:");
        Person p1 = new Person();
        p1.printInfo();

        System.out.println("\nObyekt p2 yaradırıq:");
        Person p2 = new Person("Petya", 30);
        p2.printInfo();
    }
}

Təxmini çıxış belə olacaq:

Obyekt p1 yaradırıq:
İlkinləşdirmə bloku: name = Adsız, age = 18
Parametrlərsiz konstruktor: name = Adsız, age = 21
Person: name = Adsız, age = 21

Obyekt p2 yaradırıq:
İlkinləşdirmə bloku: name = Adsız, age = 18
Parametrlərlə konstruktor: name = Adsız, age = 21
Person: name = Petya, age = 30

Nəzərə alın: parametrlərlə konstruktorda sahələrin dəyərləri hələ köhnədir (ilkinləşdirmə blokundan sonrakı dəyərlər), sahələr yalnız konstruktordan sonra yekun dəyərlərini alır.

6. İlkinləşdirmə ardıcıllığının diaqramı

Budur, vizuallaşdırma üçün kiçik bir sxem (blok-sxem):

flowchart TD
    A[Yaddaşın ayrılması, susmaya görə dəyərlər] --> B[Sahələrin açıq ilkinləşdirilməsi]
    B --> C[Qeyri-statik ilkinləşdirmə bloklarının icrası]
    C --> D[Konstruktorun icrası]
    D --> E[Obyekt istifadəyə hazırdır]

7. Xüsusiyyətlər və incəliklər

Statik sahələr və statik bloklar

Bu mühazirədə biz yalnız qeyri-statik (adi) sahələr və bloklardan danışırıq. Statik sahələr və statik bloklar sinif yüklənəndə yalnız bir dəfə ilkinləşdirilir, hər obyekt yaradıldıqda yox. Onlar haqqında ətraflı inkapsulyasiya mövzularında danışacağıq.

Nə zaman nə ilkinləşdirilir?

  • Sahələr — hər obyekt yaradıldıqda.
  • İlkinləşdirmə blokları — hər obyekt yaradıldıqda.
  • Statik sahələr və bloklar — sinif yüklənəndə yalnız bir dəfə.

İlkinləşdirmə bloklarında sahələrə müraciət etmək olarmı?

Bəli, olar! Amma vacibdir ki, yadınızda saxlayasınız: əgər sahə blokdan aşağıda elan edilibsə, o artıq mövcuddur, lakin açıq ilkinləşdirmə hələ icra olunmayıbsa, onun dəyəri susmaya görə olacaq.

8. Obyektlərin ilkinləşdirilməsində tipik səhvlər

Səhv №1: Sahələrin elan edilməzdən əvvəl ilkinləşdiriləcəyi gözləntisi.
Java-da sinif daxilində sahələrin və ilkinləşdirmə bloklarının elan olunma ardıcıllığı əhəmiyyətlidir. Əgər siz ilkinləşdirmə blokunda ondan aşağıda elan olunmuş sahəyə müraciət etsəniz, sahə artıq mövcud olacaq, amma hələ açıq şəkildə ilkinləşdirilməyib — susmaya görə dəyər alınacaq.

Səhv №2: İlkinləşdirmənin bloklarda və konstruktorlarda təkrarlanması.
Yeni başlayanlar tez-tez eyni məntiqi həm blokda, həm də konstruktorda təkrar edirlər. Daha yaxşısı, ya bloku, ya konstrukturu istifadə edin, ya da bir konstruktordan digərini this(...) ilə çağırın.

Səhv №3: Statik sahələrin hər obyekt yaradıldıqda ilkinləşdiriləcəyini gözləmək.
Statik sahələr və bloklar fərqli işləyir — onlar yalnız sinif yüklənəndə bir dəfə ilkinləşdirilir.

Səhv №4: İlkinləşdirməmiş istinad sahələrindən istifadə.
Əgər siz istinad tipli sahəni (məsələn, String name;) açıq şəkildə ilkinləşdirməyi unutmusunuzsa, o, null olacaq və yalnız siz ona ilkinləşdirmə blokunda və ya konstruktorda dəyər verdikdən sonra istifadə üçün hazır olacaq.

1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Siniflər və konstruktorlar
Siniflər və konstruktorlar
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION