1. Statik metodlar
Siniflərdə statik dəyişənlərdən əlavə statik metodlar da ola bilər.
Adi metodlar sinif obyektlərinə (nümunələrə) bağlıdır və sinfin adi dəyişənlərinə müraciət edə bilər (həmçinin statik dəyişənlərə və metodlara). Statik metodlar isə sinfin statik obyektinə bağlıdır və yalnız statik dəyişənlərə və/yaxud sinfin digər statik metodlarına müraciət edə bilər.
Adi bir metodu sinifdən çağırmaq üçün, əvvəlcə həmin sinifin obyektini yaratmaq lazımdır, və yalnız sonra obyektdən metodu çağırmaq olar. Adi metodu obyekt olmadan, yalnız sinifdən çağırmaq mümkün deyil.
Nümunə:
Statik olmayan metodu sinifdən çağırmaq mümkün deyil! |
---|
|
Statik metodu çağırmaq üçün isə sadəcə sinfin statik obyektinin mövcud olması kifayətdir (sinif yaddaşa yükləndikdən sonra bu obyekt həmişə mövcud olur). Məhz buna görə main() metodu statikdir. O, sinfin statik obyektinə bağlıdır, onu çağırmaq üçün heç bir obyekt yaratmaq lazım deyil.
Metodu statik olaraq elan etmək üçün metod başlığından əvvəl static açar sözünü yazmaq lazımdır. Bu konstruksiyanın ümumi görünüşü belədir:
static tip ad(parametrlər)
{
metodun kodu
}
Nümunələr:
Kod | Qeyd |
---|---|
|
main metodu Java maşını tərəfindən belə bir komanda ilə çağırılır: Solution.main() ; Statik metod test() statik metod main() içində çağırılır. |
Başqa bir sinifdən statik metodu çağırmaq üçün metodun adından əvvəl sinfin adını göstərmək lazımdır. Bu konstruksiyanın ümumi görünüşü belədir:
Tip ad = SinifAdi.metodAdi(parametrlər)
Nümunələr:
Kod | Statik metod |
---|---|
|
|
|
|
|
|
2. Statik vs Adi metodlar
Statik metodlar adi metodlardan nə ilə fərqlənir?
Adi metod obyektə — sinfin nümunəsinə bağlıdır, statik metod isə belə bir bağlılığa malik deyil. Adi metod öz sinfinin nümunəsindəki dəyişənlərə müraciət edə bilər, statik metod isə yox: onun sadəcə olaraq heç bir sinif nümunəsi yoxdur.
Hər iki növ metod arasındakı fərqləri cədvəldə göstərmək olar:
İmkan | Adi metod | Statik metod |
---|---|---|
Sinif nümunəsi ilə əlaqəsi var | Bəli | Xeyr |
Adi metodları çağırmaq mümkündür | Bəli | Xeyr |
Statik metodları çağırmaq mümkündür | Bəli | Bəli |
Adi dəyişənlərə müraciət etmək mümkündür | Bəli | Xeyr |
Statik dəyişənlərə müraciət etmək mümkündür | Bəli | Bəli |
Obyektlə çağırmaq mümkündür | Bəli | Bəli |
Sinif üzərindən çağırmaq mümkündür | Xeyr | Bəli |
Belə metodlar nəyə lazımdır, əgər onlar bu qədər məhduddursa? Məsələ burasındadır ki, bu yanaşmanın da üstünlükləri var.
Birincisi, statik metod və dəyişənlərə müraciət etmək üçün obyektə ehtiyac yoxdur.
İkincisi, bəzən lazımdır ki, dəyişən tək bir ədəd olsun. Məsələn, System.out
dəyişəni (System sinfinin statik dəyişəni "out").
Üçüncüsü, bəzən hələ obyekt yaratmaq imkanına malik olmadan metodu çağırmaq lazım olur. Məsələn, proqramın icrasına başladığı main() metodunun çağırılması: bu metod sinfin nümunəsi yaradılmadan əvvəl Java maşını tərəfindən çağırılır.
Sinif nümunəsi ilə əlaqəsi var
Adi metod çağırıldıqda, ona gizli bir parametr ötürülür — çağırıldığı obyekt. Bu parametrin adı this
-dir. Bu gizli parametr — metodun çağırıldığı obyektə olan işarə — adi metodlarla statikləri fərqləndirir.
Statik metodlarda belə gizli parametr yoxdur, buna görə də statik metodlar içərisində this
istifadə etmək olmaz və statik metoddan adi metoda müraciət etmək mümkün deyil: sinfin nümunəsinə istinad yoxdur.
Adi metodları çağırmaq mümkündür
Sinfin adi metodunda həmişə bir gizli parametr var — this
— çağırıldığı sinif obyektinə olan işarə. Hər dəfə adi metod başqa bir adi metodun içində çağırıldıqda, bu çağırış üçün this
gizli parametri istifadə olunur. Nümunə:
Kod | Necə işləyir |
---|---|
|
|
Məhz buna görə statik metoddan adi metod çağırmaq mümkün deyil. Statik metod içərisində sadəcə olaraq this
adında gizli parametr yoxdur.
Yaxud başqa vəziyyəti təsəvvür edin: proqramda hələ sinifin heç bir obyekti yaradılmayıb. Sinfin statik metodunu çağırmaq mümkündür? Bəli. Bu statik metod adi metod çağırmağa çalışırsa?
O metod hansının obyektində çağırılacaq? Axı bizim sinifimizin hələ bir dənə də olsun nümunəsi mövcud deyil!
Statik metodları çağırmaq mümkündür
Statik metodları istənilən yerdən — proqramın istənilən hissəsindən çağırmaq mümkündür. Bu da deməkdir ki, onları həm adi metodlardan, həm də statik metodlardan çağırmaq olar. Burada heç bir məhdudiyyət yoxdur.
Adi dəyişənlərə müraciət etmək mümkündür
Adi metodun içərisindən adi sinif dəyişənlərinə müraciət etmək mümkündür, çünki bu zaman sinfin nümunəsinin dəyişənlərinə müraciət baş verir və bu, this
gizli parametrindən istifadə edir.
Statik metod sinfin hansı nümunəsindən adi dəyişənlərin dəyərini götürə biləcəyini bilmir. Bizim asanlıqla belə vəziyyətimiz ola bilər ki, statik metod çağırılıb, amma proqramda hələ bir dənə də olsun sinif nümunəsi yaradılmayıb.
Ona görə də statik metodlar sinfin adi dəyişənlərinə müraciət edə bilməz.
Statik metod adi metod çağırır, amma hansı obyekt üzərində çağırmalı olduğu aydın deyil?

Naməlumdur! Buna görə də adi metodu obyektə istinad göstərmədən çağırmaq olmaz!
Statik dəyişənlərə müraciət etmək mümkündür
Statik dəyişənlərə müraciət etmək məsələsi statik metodlarla eynidir. Statik dəyişənlərə proqramın istənilən yerindən müraciət etmək mümkündür. Bu da deməkdir ki, statik və adi metodlardan müraciət etmək mümkündür.
Obyektlə çağırmaq mümkündür
Statik və adi metodları obyekt üzərində çağırmaq olar. Adi metod yalnız obyekt üzərində çağırıla bilər. Statik metodu obyekt üzərində də çağırmaq olar: bu zaman kompilyator dəyişənin tipini müəyyən edir və həmin tipe uyğun statik metodu çağırır:
Kod | Kompilyator necə görür |
---|---|
|
|
|
|
|
|
Sinifdən çağırmaq mümkündür
Sinifdən yalnız statik metod çağırmaq olar, adi metodu çağırmaq üçün sinfin nümunəsinə istinad lazımdır. Buna görə də, SinifAdi.metodAdi(parametrlər)
şəklində adi metodu çağırmaq olmaz.
GO TO FULL VERSION