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 |
---|---|
|
print adlı metod müəyyən edilib,String str parametrinə malikdir. |
|
print adlı metod iki parametr ilə müəyyən edilib:String str int count |
|
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 |
---|---|
|
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 |
---|---|
|
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"
, 10
və 20
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 |
---|---|
|
Metodu elan etdik printLines parametrlərlə:String text , int count Metod ekrana count dəfə sıra ilə text çap edirMetodu ç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 |
---|---|
|
Metodu elan etdik printLines parametrlərlə:String text , int count Metod ekrana count dəfə sıra ilə text çap edirMetodu ç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 str
və n
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ı. text
və text
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:
Bəs bu dəyişənlərdən biri metodun parametr dəyişəni olarsa, nə baş verəcək?
Kod | İzah |
---|---|
|
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 |
---|---|
|
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 |
---|---|
|
Bu üç metod fərqli hesab olunur. Onları bir sinifdə elan etmək olar. |
|
Bu beş metodun hamısı fərqli hesab olunur. Onları bir sinifdə elan etmək olar. |
|
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.
GO TO FULL VERSION