1. Statik o'zgaruvchilar
Sinf xotiraga yuklanganida, darhol statik sinf obyekti yaratiladi. Ushbu obyekt sinfning statik o'zgaruvchilarini (sinfning statik maydonlarini) saqlaydi. Statik sinf obyekti mavjud, hatto sinfning hech qanday oddiy obyekti yaratilmagan bo'lsa ham.
Sinfda o'zgaruvchilarni tavsiflaganimizda, biz ushbu o'zgaruvchilar faqat bir marta yaratiladimi yoki har bir obyekti uchun ularning nusxalarini yaratish kerakmi, bu haqida ko'rsatamiz. Odatda har bir obyekti uchun o'zgaruvchining yangi nusxasi yaratiladi.
Statik (static) o'zgaruvchi esa statik sinf obyektiga bog'langan va har doim yagona nusxada mavjud.
Sinfning statik o'zgaruvchisini yaratish uchun uning nomi oldida static kalit so'zini yozish kerak. Statik o'zgaruvchini e'lon qilish umumiy ko'rinishi:
static Tur nomi = qiymat;
Agar statik o'zgaruvchiga boshlang'ich qiymat berilmasa, u default qiymat bilan initsializatsiya qilinadi:
| Tur | Default qiymat |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(xuddi kabi) |
|
|
va har qanday sinflar |
|
Misollar:
| Kod |
|---|
|
|
|
|
|
Statik o'zgaruvchiga uning sinfida ism orqali murojaat qilsa bo'ladi. Agar murojaat boshqa sinfdan bo'lsa, statik o'zgaruvchining nomi oldida sinf nomini yozish kerak.
SinfNomi.o'zgaruvchi
Misol:
| O'zgaruvchi | Sinf | Sinfdan tashqarida o'zgaruvchiga murojaat |
|---|---|---|
|
|
|
|
|
|
|
|
O'zgaruvchi private, sinfdan tashqarida ko'rinmaydi |
|
|
O'zgaruvchi private, sinfdan tashqarida ko'rinmaydi |
|
|
O'zgaruvchi private, sinfdan tashqarida ko'rinmaydi |
2. Statik va oddiy o'zgaruvchilar o'rtasidagi farq
Oddiy (oddiy) sinfning o'zgaruvchilari xuddi statiklar kabi e'lon qilinadi, faqat static kalit so'zisiz.
Oddiy va statik o'zgaruvchilar o'rtasida qanday farqlar bor?
Oddiy sinfning o'zgaruvchilari sinf obyektlariga bog'langan (sinfning nusxalari), statik o'zgaruvchilar esa sinfning statik obyektiga.
Agar sinfning bir nechta nusxasi bo'lsa, har birida sinfning oddiy (oddiy) o'zgaruvchilarining o'z nusxasi mavjud. Sinfning statik o'zgaruvchilari har doim sinfning statik obyektida bo'ladi va faqat bitta nusxada mavjud.
Sinfning oddiy o'zgaruvchilariga (sinfning maydonlari) faqat sinf obyekti uchun havolaga ega bo'lgan holda murojaat qilish mumkin. Yoki ushbu sinf ichidagi metodlarda.
Misol:
| Sinfning maydoniga havola orqali murojaat qilish |
|---|
|
Statik o'zgaruvchilarga har qanday joydan murojaat qilish mumkin (vidimlik modifikatorlarini hisobga olgan holda): oddiy metodlardan, o'sha sinfning statik metodlaridan, boshqa sinflarning metodlaridan va hokazo.
Misol:
| Sinfning statik maydoniga havolani foydalanmasdan murojaat qilish |
|---|
|
Xotirada tuzilishi:
Faraz qilaylik, bizda Person sinfi mavjud bo'lib, unda 4 maydon bor: ikkita statik va ikkita oddiy.
public class Person
{
public static int count = 0;
public static int sum = 0;
public int age = 0;
public String name;
}
Sinf yuklangandan so'ng darhol
Java-mashina Person sinfini yuklashni tugatgandan so'ng, xotirada bizda quyidagi manzara kuzatiladi:

Birinchi obyektni yaratgandan so'ng
Agar biz Person sinfining obyekti yaratsak, manzara quyidagi dasturga aylanadi

E'tibor bering, obyektlarda ikkita o'zgaruvchi bor, lekin bu turli o'zgaruvchilar: oddiy obyektda - oddiy, statik obyektda esa - statik.
Ko'proq obyektlar kerak
Keling, yana ikkita obyekt yaratamiz, ular Person turiga kiradi. Yangi manzara quyidagi ko'rinishga ega bo'ladi:

E'tibor bering: har bir obyektning o'ziga xos age va name o'zgaruvchisi mavjud.
3 Static modifikatorni o'chirish va qo'shish
Statikdan oddiysiga
Statik o'zgaruvchini olib, uni oddiyga aylantirsak nima bo'ladi: biz static modifikatorini olib tashlaymizmi? Masalan, static int sum o'zgaruvchisiga.
O'zgartirilgan kod quyidagi ko'rinishga ega bo'ladi:
public class Person
{
public static int count = 0;
public int sum = 0;
public int age = 0;
public String name;
}
Xotirada biz quyidagi manzarani olamiz:

Statik o'zgaruvchi statik obyektda yo'qoladi, lekin har bir obyektning o'z sum o'zgaruvchisi mavjud bo'ladi.
Oddiydan statik
Aksincha qilish mumkin: sinfning oddiy o'zgaruvchilari oldiga static modifikatorini qo'shib qo'yish mumkin, va keyin ular barcha obyektdan g'oyib bo'lib, statik obyektga beriladi. Misol uchun, biz age va name o'zgaruvchilarini statik qilishga qaror qildik. Keyin kod quyidagi ko'rinishga ega bo'ladi:
public class Person
{
public static int count = 0;
public int sum = 0;
public static int age = 0;
public static String name;
}
Xotirada biz quyidagi manzarani olamiz:
GO TO FULL VERSION