CodeGym /Kurslar /Java SELF AZ /Java-da Funksiya Parametrləri

Java-da Funksiya Parametrləri

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

1. Parametrlərin ötürülməsi

İndi maraqlı hissəyə keçirik. Çox güman ki, artıq System.out.println() kimi metodlardan bilirsiniz ki, metodlara parametrlər ötürülə bilər. Bu isə, əslində, metodların yaradılması və istifadəsinin faydasını xeyli artırır.

Bəs, parametrləri olan bir metodu necə elan edək? Əslində bu olduqca sadədir:

public static void ad(parametrlər)
{
   metod kodu
}

Burada ad metodun unikal adı, metod kodu isə metodun içində olan əmrlərdir. parametrlər metodun parametrləridir, vergül ilə ayrılır. Gəlin bu nümunəni daha detallar ilə şərh edək:

public static void ad(tip1 ad1, tip2 ad2, tip3 ad3)
{    metod kodu
}

Nümunələr:

Kod Açıqlama
public static void print(String str)
{
}
print adlı metod müəyyən edilib,
String str parametrinə malikdir.
public static void print(String str, int count)
{
}
print adlı metod iki parametr ilə müəyyən edilib:
String str
int count
public static void write(int x, int y)
{
}
write adlı metod iki parametr ilə müəyyən edilib:
int x
int y

Əgər istəmirik ki, metodun parametrləri olsun, sadəcə olaraq dairəvi mötərizələri boş qoyuruq.

Parametrlər metodun xüsusi dəyişənləridir. Onlar vasitəsilə metoda müxtəlif dəyərlər ötürmək mümkündür.

Məsələn, gəlin bir metod yazaq, hansı ki ekrana mətn sətirini müəyyən sayda çıxarır.

Bir mətnin ekrana bir neçə dəfə çıxarılmasının kodunu artıq bilirsiniz. Amma hansı mətni çıxaracağıq? Və neçə dəfə? Bax, bunun üçün parametrlərə ehtiyacımız var.

Bu tapşırığın kodu belə olacaq:

Kod Açıqlama
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Salam", 10);
     printLines("Sağ ol", 20);
   }
}


printLines adlı metodun müəyyən edilməsi:
String text, int count
Metod ekranda count dəfə text sətirini çap edir.





printLines metodu müxtəlif parametrlərlə çağırılır.

Metod hər dəfə çağırılanda, onun parametr dəyişənlərinə ötürülən dəyərlər təyin olunur və yalnız bundan sonra metodun daxilində olan əmrlər yerinə yetirilməyə başlayır.


2. Metodun arqumentləri

Bir az daha diqqətinizi metodun parametrlərlə çağırılmasına yönəltmək istəyirəm.

Metoda çağırıldığı zaman ötürülən dəyərlər metodun arqumentləri adlanır.

Gəlin bir daha nümunəni nəzərdən keçirək:

Kod İzah
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Salam", 10);
     printLines("Sağol", 20);
   }
}


Metod printLines parametrlərlə elan etdik:
String text, int count
Metod ekrana count dəfə text sətirini çıxarır.




Metodu printLines aşağıdakı parametrlərlə çağırırıq:
text = "Salam"; count = 10;
text = "Sağol"; count = 20;

Metod printLines ilk dəfə çağırıldığında, onun parametr dəyişənlərinə bu cür dəyərlər təyin edildi:
String text = "Salam", int count = 10.

Metod printLines ikinci dəfə çağırıldığında, onun parametr dəyişənlərinə digər dəyərlər təyin edildi:
String text = "Sağol", int count = 20.

Metodun parametrləri — məhz metod çağırılarkən müəyyən dəyərlər təyin olunan dəyişənlərdir. Dəyərlərin özləri "Salam", "Sağol", 1020 metodun arqumentləri adlanır.


3. Metod çağırışında dəyişən adlarının konflikti

Metodun arqumentləri kimi dəyişənlərdən istifadə etmək olar. Bu sadədir və başa düşüləndir, amma potensial olaraq bəzi çətinliklər yarada bilər. Gəlin eyni nümunəni nəzərdən keçirək, amma arqumentləri ayrıca dəyişənlərə çıxaraq:

Kod İzah
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String str = "Salam";
     int n = 10;
     printLines(str, n);
   }
}


Metodu elan etdik printLines parametrlərlə:
String text, int count
Metod ekrana count dəfə sıra ilə text çap edir







Metodu çağırırıq printLines parametrlərlə:
text = str;
count = n;

Hələ ki, heç bir çətinlik yoxdur: bizdə str adlı dəyişən var, onun dəyəri metodu çağıranda text dəyişəninə təyin olunur. Bizdə n adlı dəyişən var, onun dəyəri metodu çağıranda count dəyişəninə təyin olunur. Hələ ki, hər şey aydındır.

İndi isə gəlin metodun içindəki dəyişənlərin adını dəyişək main:

Kod İzah
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)    {
     String text = "Salam";
     int count = 10;
     printLines(text, count);
   }
}


Metodu elan etdik printLines parametrlərlə:
String text, int count
Metod ekrana count dəfə sıra ilə text çap edir







Metodu çağırırıq printLines parametrlərlə:
text = text;
count = count;

İki məsələyə diqqət yetirin

Birinicisi: fərqli metodlarda eyni adlı dəyişənlərimiz var. Bunlar fərqli dəyişənlərdir (onları qəsdən fərqli rənglərlə işarələdik). Hər şey əvvəlki nümunədəki kimi işləyir, metodun içində dəyişənlər strn adlananda olduğu kimi.

İkincisi: metodu çağıranda heç bir möcüzə baş vermir. Parametrlərə sadəcə arqumentlərin dəyərləri təyin olunur. Bu istər konkret rəqəmlər, sətirlər, dəyişənlər və ya ifadələr olsun, fərqi yoxdur.

Main metodunun dəyişənlərinin adını dəyişdikdən sonra heç nə dəyişmədi. Necə ki, bunlar fərqli metodlarda fərqli dəyişənlər idi, elə də qaldı. texttext dəyişənlərinin arasında heç bir sehrli bağ yoxdur.



4. Metodlara istinadların ötürülməsi

Ümid edirəm ki, əvvəlki dərsi tam başa düşdünüz, çünki indi biz yenidən arqumentlərin metodlara ötürülməsinə toxunacağıq, amma daha dərindən.

Artıq bildiyiniz kimi, Java-da bəzi dəyişənlər sadəcə dəyəri saxlamır, əksinə həmin dəyərin yaddaşda yerləşdiyi blokun ünvanını (istinadını) saxlayır. Məsələn, belə işləyir string və ya massiv dəyişənləri.

Dəyişən-massivə başqa bir dəyişən-massiv təyin etdikdə nə baş verir? Düzdür. İki dəyişən yaddaşda eyni konteynerə istinad etməyə başlayır:

Metodlara istinadların ötürülməsi

Bəs bu dəyişənlərdən biri metodun parametr dəyişəni olarsa, nə baş verəcək?

Kod İzah
class Solution
{
   public static void printArraySum(int[] data)
   {
     int sum = 0;
     for (int i = 0; i < data.length; i++)
       sum = sum + data[i];
     System.out.println(sum);
   }
   
   public static void main(String[] args)
   {
     int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30};
     printArraySum(months);
   }
}


Metod printArraySum ötürülmüş massivdəki rəqəmlərin cəmini hesablayıb ekrana çıxarır

Həmin hadisə baş verəcək: parametr dəyişəni data həmin konteynerə istinad edəcək ki, əsas dəyişən months edir. Metod çağırıldıqda sadəcə olaraq data = months təyin etməsi baş verir.

Bundan əlavə, hər iki dəyişən eyni tam rəqəmlər konteynerinə istinad etdiyindən, printArraySum metodu yalnız massivdən dəyərləri oxuya deyil, həm də onları dəyişdirə bilər!

Məsələn, özümüzün ikitərəfli massivi eyni dəyərlərlə dolduran metodumuzu yarada bilərik. O aşağıdakı şəkildə görünə bilər:

Kod İzah
class Solution
{
   public static void fill(int[][] data, int value)
   {
     for (int i = 0; i < data.length; i++)
     {
       for (int j = 0; j < data[i].length; j++)
         data[i][j] = value;
     }
  }

   public static void main(String[] args)
   {
     int[][] months = {{31, 28}, {31, 30, 31}, {30, 31, 31}};
     fill (months, 8);
   }
}


Metod fill ötürülmüş ikitərəfli massivdəki bütün xanaları gəzir və onlara value dəyərini təyin edir.








İkitərəfli massiv yaradırıq.
Bütün massivi 8 rəqəmi ilə doldururuq.


5. Eyni Adlı Metodlar

İndi isə metodların adlarına bir də baxaq.

Java standartları tələb edir ki, bir sinifin daxilindəki bütün metodların adları unikal olsun. Yəni bir sinifdə iki eyni adlı metodu elan etmək mümkün deyil.

Ancaq metodların eyni olub-olmaması müqayisə edilərkən yalnız adlara deyil, həm də parametrlərin tiplərinə baxılır! Parametr dəyişənlərinin adları isə nəzərə alınmır. Məsələn:

Kod Şərh
void fill(int[] data, int value) {
}
void fill(int[][] data, int value) {
}
void fill(int[][][] data, int value)  {
}
Bu üç metod fərqli hesab olunur. Onları bir sinifdə elan etmək olar.
void print(String str) {
}
void print(String str, String str2) {
}
void print(int val) {
}
void print(double val) {
}
void print() {
}
Bu beş metodun hamısı fərqli hesab olunur. Onları bir sinifdə elan etmək olar.
void sum(int x, int y) {
}
void sum(int data, int value) {
}
Bu iki metod eynidir (onları bir sinifdə elan etmək olmaz).

Niyə bəzi metodlar eynidir, digərləri isə fərqlidir? Və niyə metodun unikal olduğunu müəyyən edərkən parametr dəyişənlərinin adları nəzərə alınmır?

Ümumiyyətlə niyə unikal olmaq lazımdır? Səbəb isə budur ki, kompilyator proqramınızı kompilyasiya edərkən müəyyən bir yerdə konkret olaraq hansı funksiyanın/metodun çağırıldığını dəqiq bilməlidir.

Məsələn, siz yazırsınız: System.out.println("Salam"). Kompilyator ağıllıdır və rahatlıqla başa düşür ki, burada String tipli parametr ilə println() metodu çağırılır.

Əgər yazsanız System.out.println(1.0), kompilyator burada double tipli parametr ilə println() metodunun çağırıldığını görəcək.

Kompilyator metod çağrılarkən arqumentlərin və parametrlərin tiplərinin uyğunluğunu yoxlayır, amma arqumentin adına heç bir diqqət yetirmir. Java-da parametr dəyişənlərinin adları heç bir şəkildə kompilyatora çağırılan metodu müəyyənləşdirməkdə kömək etmir. Buna görə metodun unikal olduğunu müəyyən edərkən nəzərə alınmır.

Metodun adı və onun parametrlərinin tipi metodun imzası adlanır. Məsələn: sum(int, int)

Hər bir sinif metodların adlarının unikal olmasını yox, metodların imzalarının unikal olmasını təmin etməlidir.


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