1. Statik metodlar
Statik o'zgaruvchilar bilan birga, klasslarda statik metodlar ham bo'lishi mumkin.
Oddiy metodlar klassning obyektlariga bog'langan (namunalari) va ular oddiy klass- o'zgaruvchilariga murojaat qilishlari mumkin (va shuningdek statik o'zgaruvchilar va metodlar). Statik metodlar esa klassning statik obyektiga bog'langan va ular faqat statik o'zgaruvchilar va/yoki boshqa statik klass metodlariga murojaat qilishlari mumkin.
Oddiy metodni klassda chaqirish uchun, avval bu klassdan obyekt yaratish kerak, shundagina obyektning metodini chaqirish mumkin. Oddiy metodni obyekt emas, klassdan chaqirish iloji yo'q.
Misol:
| Oddiy metodni klassdan chaqirish mumkin emas! |
|---|
|
Statik metodni chaqirish uchun, faqat statik obyekt mavjud bo'lishi kerak (u har doim klass xotirada yuklanganidan keyin mavjud bo'ladi). Mana shuning uchun main() metodi statik. U klassning statik obyektiga bog'langan, uni chaqirish uchun hech qanday obyekt yaratishga hojat yo'q.
Metodni statik e'lon qilish uchun, metod sarlavhasi oldida static kalit so'zni yozish kerak. Ushbu tuzilishning umumiy ko'rinishi quyidagicha:
static tip nom(parametrlar)
{
metod kodi
}
Misollar:
| Kod | Izoh |
|---|---|
|
Metod main Java-mashinasi tomonidan quyidagi buyruq bilan chaqiriladi: Solution.main(); Statik metod test() statik metod main()da chaqiriladi. |
Boshqa klassdan statik metodni chaqirish uchun, statik metod nomidan oldin klass nomini ko'rsating. Ushbu tuzilmaning umumiy ko'rinishi quyidagicha:
Tip nom = KlassNomi.metodNomi(parametrlar)
Misollar:
| Kod | Statik metod |
|---|---|
|
|
|
|
|
|
2. Statik vs Oddiy metodlar
Statik metodlar oddiy metodlardan nimasi bilan farq qiladi?
Oddiy metod - bu obyektga - klass namunasiga bog'langan, statik metod esa bunday bog'lanishga ega emas. Oddiy metod klassning o'zgaruvchilariga murojaat qilishi mumkin, statik esa qilolmaydi: bu metodlar bilan bog'liq hech qanday klass namunalari mavjud emas.
Ikki xil metodlar farqi jadvalda ifodalangan:
| Salohiyat | Oddiy metod | Statik metod |
|---|---|---|
| Klass namunasiga bog'lanish mavjud | Ha | Yo'q |
| Oddiy metodlarni chaqira oladi | Ha | Yo'q |
| Statik metodlarni chaqira oladi | Ha | Ha |
| Oddiy klass o'zgaruvchilariga murojaat qila oladi | Ha | Yo'q |
| Statik klass o'zgaruvchilariga murojaat qila oladi | Ha | Ha |
| Obyektda chaqirilishi mumkin | Ha | Ha |
| Klassda chaqirilishi mumkin | Yo'q | Ha |
Nega bunday metodlar kerak, agar ular shuncha cheklangan bo'lsa? Gap shundaki, bunday yondashuvning ham o'z afzalliklari bor.
Birinchidan, statik metodlar va o'zgaruvchilarga murojaat qilish uchun hech qanday obyekt havolasi kerak emas.
Ikkinchidan, ba'zan o'zgaruvchilar yagona nusxada bo'lishi kerak. Masalan, System.out o'zgaruvchisi (System klassining statik o'zgaruvchisi out).
Uchinchidan, ba'zida metodni chaqirish kerak, hatto biror-bir obyektni yaratish imkoniyati bo'lgunga qadar. Masalan, dastur bajarilishini boshlaydigan main() metodi: uni Java mashina klass nusxasini yaratishdan oldin chaqiradi.
Klass namunasiga bog'lanish mavjud
Oddiy metodni chaqirganda unga yashirin parametr — unga nisbatan metod chaqirilgan obyekt uzatiladi. Bu parametr this nomiga ega. Bu yagona yashirin parametr, ya'ni metod chaqirilgan obyektga havola statik metodlardan oddiy metodlarni ajratib turadigan narsadir.
Statik metodlarda bunday yashirin parametr yo'q, shuning uchun statik metodlar ichida this kalit so'zidan foydalanish mumkin emas va statik metoddan oddiy metodni chaqirish mumkin emas: klass nusxasiga havola olish imkoniyati yo'q.
Oddiy metodlarni chaqira oladi
Oddiy klass metodida har doim yashirin parametr — this — klassning metod chaqirilgan obyektiga havola mavjud. Har safar siz oddiy metodni boshqa oddiy metod ichida chaqirganingizda, bu chaqiruv uchun this yashirin parametrlardan foydalaniladi. Misol
| Kod | Qanday ishlaydi |
|---|---|
|
|
Shuning uchun oddiy metodni statikdan chaqirib bo'lmaydi. Statik metod ichida this nomiga ega yashirin o'zgaruvchi mavjud emas.
Yoki boshqa vaziyatni tasavvur qiling: dasturda hali bizning klassimizdan birorta ham obyekt yaratilmadi. Klassning statik metodi chaqirilishi mumkinmi? Ha. Bu statik metod oddiy metodni chaqira oladimi?
Qaysi obyekt uchun u chaqirilishi mumkin? Axir hali bizning klassimizning birorta ham nusxasi yaratilmagan!
Statik klass metodlarini chaqira oladi
Statik metodlarni dasturda istalgan joydan chaqirish mumkin. Demak, ular statik metodlardan ham, oddiy metodlardan ham chaqirilishi mumkin. Bu yerda hech qanday cheklovlar yo'q.
Oddiy klass o'zgaruvchilariga murojaat qila oladi
Oddiy metoddin klassning oddiy o'zgaruvchilariga murojaat qilish mumkin, chunki bunda klass nusxasining o'zgaruvchilariga murojaat yuz beradi, u esa this yashirin parametridan oson olinadi.
Statik metod klassning oddiy o'zgaruvchilarini qaysi nusxadan olishni bilmaydi. Bizni holatimizda statik metod chaqirilgan, lekin dasturda hali bironta ham klass nusxasi yaratilmagan bo'lishi mumkin.
Shuning uchun statik metodlar klassning oddiy o'zgaruvchilariga murojaat qila olmaydi.
Statik metod oddiy metodni chaqiradi, lekin qaysi obyektga nisbatan chaqiriladi?
Noma'lum! Shuning uchun oddiy metodni statikdan chaqirib bo'lmaydi, obyektga havola ko'rsatmasdan!
Statik klass o'zgaruvchilariga murojaat qila oladi
Statik o'zgaruvchilarga murojaat qilish holati statik metodlarga murojaat qilish kabi. Statik o'zgaruvchilarga dasturda istalgan joydan murojaat qilish mumkin. Shuning uchun ular statik metodlardan, shuningdek, oddiy metodlardan ham murojaat qilish mumkin.
Obyektda chaqirilishi mumkin
Statik ham, oddiy metodlar ham obyektlarda chaqirilishi mumkin. Oddiy metod, chunki uni faqat obyektlarda chaqirish mumkin. Statik metod ham obyektlarda chaqirilishi mumkin: bu holatda kompilyator o'zi o'zgaruvchi turini aniqlab, uning turiga qarab statik metodni chaqiradi:
| Kod | Kompilyator uni qanday ko'radi |
|---|---|
|
|
|
|
|
|
Klassda chaqirilishi mumkin
Klassda faqat statik metodi chaqirilishi mumkin, oddiy metodni chaqirish uchun klassning nusxasiga havola kerak. Shuning uchun oddiy metodni KlassNomi.metodNomi(parametrlar) ko'rinishida chaqirib bo'lmaydi
GO TO FULL VERSION