CodeGym /Kurslar /Java SELF AZ /Statik metodlar

Statik metodlar

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

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!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // burada xəta olacaq!
   }
}

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
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


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
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


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
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

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?

Statik metodlar

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
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

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.


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION