Java. Obyektlərin idarə olunması.

Verdiyev Mahammad
4 min readJan 30, 2021

--

Javada bütün obyektlər heap yaddaşda saxlanıldığı üçün biz onları birbaşa yox, dolayı yol ilə, yəni referanslarla idarə edirik. Bu o deməkdir ki, javada obyekt dəyişəni deyə birşey yoxdur, referans dəyişəni vardır. Referans dəyişəni özündə obyektin yaddaşda olduğu adresi saxlayır, yəni dəyişən birbaşa özündə obyekti saxlamır.

Biz bir dəyişənə obyekt doldura bilmərik. Tez-tez bunu elə başa düşürük, məsələn, deyirikki: “car1 dəyişəninə Car obyekti qoydum“, “foo() metodu Car obyekti qaytarır” və s. bu elə deyildir.

Pultu referans dəyişəni kimi düşünün. car1.start() o deməkdir ki,

“start() metodunu çağırmaq üçün car1 adlı referans dəyişənini istifadə et”.

Referans dəyişəni üzərində nöqtə operatorunu istifadə edəndə pultun düyməsini sıxırmış kimi düşünün.

Obyektin yaranma mərhələsi

  1. Referans dəyişənin elan edilməsi.

Ilk addımımızda JVM(Java Virtual Machine) bizim üçün stack yaddaşda “Car” tipindən olan referans dəyişəni yaradır.Başqa bir sözlə “Car” tipindən olan obyekti idarə etmək üçün bir pult.

2. Obyektin yaradılması.

İkinci addımda JVM heap yaddaşda yeni “Car” obyekti üçün yer ayırır. “new” ifadəsi yaddaşda yer ayrılmasını təmin edən açar sözüdür, Car() isə konstruktordur.

3. Mənimsətmə.

Son addımda yeni yaratdığımız “Car” obyektinin referansını dəyişənə mənimsədirik. Beləliklə biz heap yaddaşda olan “Car” obyektini stack yaddaşda yerləşən “car1” referans dəyişəni ilə idarə edə bilərik.

Heap yaddaşdakı “həyat”.

Car car1 = new Car();

Car car2 = new Car();

referans sayı: 2

obyekt sayı: 2

2 “Car” tipində obyekt yaradıb car1 və car2 referans dəyişənlərinə mənimsətdik. Hər iki obyekt proqram işlədiyi və dəyişən ilə arasındakı əlaqə qopmadığı müddətcə heap yaddaşda “yaşayacaq”. Əgər biz car1 = null desək artıq car1 dəyişəni özündə 1 nömrəli obyektin adresini saxlamayacaq. Bir Obyektin heçbir referans dəyişəni ilə əlaqəsi yoxdursa, başqa sözlə desək, o obyektin adresini heçbir referans dəyişəni saxlamırsa Garbage Collector bu obyekti əlavə yer tutmaması üçün yaddaşdan silir.

Car car3 = car2;

referans sayı: 3

obyekt sayı: 2

Bu dəfə biz yeni bir “Car” obyekti yaratmadıq. “car2” referans dəyişənin qiymətini “car3” referans dəyişəninə mənimsətdik, yəni car2 dəyişəninin qiyməti kopyalandı və car3 dəyişəninə mənimsədildi. Bu o deməkdirki hər iki referans dəyişəni eyni obyektə istinad edir, hər iki dəyişən bir dəyərin fərqli kopyasını özündə saxlayır. Bunu bir televizora proqramlanan iki pult kimi də düşünə bilərsiniz.

car2 = car1;

referans sayı: 3

obyekt sayı: 2

Bunun nə mənaya gəldiyini artıq bilirsiniz, burada “car1” referans dəyişənin qiymətini kopyalayıb “car2” referans dəyişəninə mənimsətdik. “car2” və “car1” dəyişənləri özündə eyni obyektin referanslarını saxlayırlar.

car3 = car2;

aktiv referans sayı: 3

əlçatan obyekt sayı: 1

tərk edilən obyekt sayı: 1

Burada “car3”, “car2”, və “car1” eyni obyekti göstərirlər. Artıq 2 nömrəli obyektin referansını heçbir dəyişən saxlamır, bu o deməkdir ki Garbage Collector bir müddətdən sonra bu obyekti yaddaşdan(heap) siləcək.

car2 = null;

car3 = null;

aktiv referans sayı: 1

null referans sayı: 2

əlçatan obyekt sayı: 1

Burada isə biz “car2” və “car3” referans dəyişənlərinə null dəyərini mənimsətdik. Bu o deməkdir ki, artıq bu dəyişənlər heçbir obyektə istinad etmir(heç bir obyektə proqramlanmayan pultlar kimi düşünün). 1 nömrəli obyektin referansını hələdə “car1” dəyişəni saxladığı üçün bu obyekt yaddaşda “ömrünü” davam etdirəcək.

Vaxt ayırıb oxuduğunuz üçün təşəkkürlər.

--

--

Verdiyev Mahammad
Verdiyev Mahammad

Written by Verdiyev Mahammad

In God we trust; all others bring data - W. Edwards Deming

No responses yet