Giriş
Bildiyimiz kimi Java obyekt yönümlü proqramlaşdırma dilidir. Yəni əsas anlayış, çünki əsasların əsasını demək hər şeyin bir obyekt olmasıdır. Obyektlər siniflərdən istifadə etməklə təsvir olunur.
Siniflər də öz növbəsində vəziyyətə və davranışa malikdirlər. Məsələn, bir bank hesabı hesabdakı pul məbləği şəklində bir vəziyyətə sahib ola bilər və balansı artırma və azaltma davranışına sahib ola bilər. Java-da davranış metodlardan istifadə etməklə həyata keçirilir. Metodları necə təsvir etmək Java öyrənmə səyahətinizin ən əvvəlində təqdim olunur. Məsələn, Oracle-ın rəsmi təlimatında: “
Metodların müəyyən edilməsi ”. Burada iki mühüm cəhət var:
- Hər bir metodun imzası var. İmza metodun adından və onun daxiletmə parametrlərindən ibarətdir;
- Metodlar qaytarma növünü müəyyən etməlidir;
- Qaytarma növü metod imzasının bir hissəsi deyil.
Yenə də bu, Java-nın güclü tipli bir dil olması və tərtibçinin mümkün qədər harada istifadə olunduğunu əvvəlcədən anlamaq istəməsinin nəticəsidir. Yenə bizi səhvlərdən qorumaq üçün. Ümumiyyətlə, hər şey xeyirxahlıq üçündür. Mənə elə gəlir ki, bu bir daha bizə məlumatlarla işləmək mədəniyyətini aşılayır. Beləliklə, metodlar üçün dəyər növü müəyyən edilir. Metodlardan eyni dəyəri qaytarmaq üçün açar sözdən istifadə olunur
return
.
Java-da açar söz qaytarma ifadəsi
Bəyanat açar sözü
return
oracle təlimatında müzakirə edildiyi kimi "nəzarət axını bəyanatlarına" istinad edir "
Nəzarət axını hesabatları ". Dəyərləri necə qaytarmaq barədə rəsmi dərslikdə də oxuya bilərsiniz: “
Metoddan dəyərin qaytarılması ”. Kompilyator öz imkanları daxilində diqqətlə izləyir ki, metoddan qaytarılan dəyər metod tərəfindən müəyyən edilmiş qaytarılan dəyər növünə uyğun gəlir. Nümunə olaraq tutorialspoint-dən
Onlayn IDE-dən istifadə edək. Orijinal nümunəyə baxaq:
public class HelloWorld {
public static void main(String []args) {
System.out.println("Hello World");
}
}
Gördüyümüz kimi burada
main
proqrama giriş nöqtəsi olan metod icra olunur. Kod sətirləri yuxarıdan aşağı yerinə yetirilir. Metodumuz
main
dəyərləri qaytara bilməz, əks halda xəta alacağıq: "
Error: Main method must return a value of type void
". Buna görə də, metod sadəcə ekrana çıxacaq. İndi sətirin qəbulunu mesajın alınması üçün ayrıca metoda köçürək:
public class HelloWorld {
public static void main(String []args) {
System.out.println(getHelloMessage());
}
public static String getHelloMessage() {
return "Hello World";
}
}
Gördüyümüz kimi, açar sözdən istifadə edərək
return
daha sonra metodda istifadə etdiyimiz qaytarma dəyərini təyin etdik
println
. Metodun təsvirində (tərifində)
getHelloMessage
onun bizə qayıdacağını qeyd etdik
String
. Bu, kompilyatora metodun hərəkətlərinin elan edilmə üsulu ilə uyğunluğunu yoxlamağa imkan verir. Təbii ki, metodun tərifində göstərilən qaytarma dəyərinin növü koddan qaytarılan dəyərin növündən daha geniş ola bilər, yəni. Əsas odur ki, növlər bir-birinə azaldılır. Əks halda biz tərtib vaxtı xətası alacağıq: "
error: incompatible types
". Yeri gəlmişkən, yəqin ki, dərhal sual yarandı: Nə üçün
return
bu, proqram axını idarə edən operatorlara aiddir? Lakin proqramın yuxarıdan aşağıya normal gedişatını poza biləcəyi üçün. Misal üçün:
public class HelloWorld {
public static void main(String []args){
if (args.length == 0) {
return;
}
for (String arg : args) {
System.out.println(arg);
}
}
}
Nümunədən göründüyü kimi
main
java proqramımız parametrsiz çağırılırsa metodun icrasını kəsirik. Yadda saxlamaq vacibdir ki, əgər o zaman
return
kodunuz varsa, o, əlçatmaz olur. Və bizim ağıllı kompilyator bunu görəcək və belə bir proqramı işlətməyə imkan verməyəcək. Məsələn, bu kod tərtib edilməyəcək:
public static void main(String []args) {
System.out.println("1");
return;
System.out.println("2");
}
Bunun ətrafında olmaq üçün çirkli bir hack var. Məsələn, sazlama məqsədləri üçün və ya başqa bir səbəbdən.
return
Yuxarıdakı kodu bloka sarmaqla düzəldilə bilər
if
:
if (2==2) {
return;
}
Səhvlərin idarə edilməsində ifadəni qaytarın
Çox çətin bir vəziyyət var - biz onu
return
səhvlərin idarə edilməsi ilə birlikdə istifadə edə bilərik. Dərhal demək istərdim ki, onu
return
blokda istifadə etmək
catch
çox, çox pis formadır, ona görə də bundan qaçınmalısınız. Amma bizə bir nümunə lazımdır, elə deyilmi? Budur o:
public class HelloWorld {
public static void main(String []args) {
System.out.println("Value is: " + getIntValue());
}
public static int getIntValue() {
int value = 1;
try {
System.out.println("Something terrible happens");
throw new Exception();
} catch (Exception e) {
System.out.println("Catched value: " + value);
return value;
} finally {
value++;
System.out.println("New value: " + value);
}
}
}
İlk baxışdan 2-ni qaytarmaq lazımdır, çünki
finally
həmişə icra olunur. Ancaq yox, dəyər 1 olacaq və dəyişənə edilən dəyişiklik
finally
nəzərə alınmayacaq. Üstəlik, əgər onun
value
tərkibində obyekt varsa və biz
finally
dediksə
value = null
, o,
catch
yenə də obyektə deyil, istinadı qaytaracaq
null
. Amma blokdan
finally
operator
return
düzgün işləyəcəkdi. Həmkarlar belə bir hədiyyə üçün sizə açıq şəkildə təşəkkür etməyəcəklər.
boş.sinif
Və nəhayət. kimi qəribə konstruksiya yaza bilərsiniz
void.class
. Görünür, niyə və nə məqsədlə? Əslində,
Java Reflection API-nin istifadə edildiyi müxtəlif çərçivələrdə və çətin hallarda bu çox lazım ola bilər. Məsələn, metodun hansı növü qaytardığını yoxlaya bilərsiniz:
import java.lang.reflect.Method;
public class HelloWorld {
public void getVoidValue() {
}
public static void main(String[] args) {
for (Method method : HelloWorld.class.getDeclaredMethods()) {
System.out.println(method.getReturnType() == void.class);
}
}
}
Bu, real metodlar kodunu əvəz etmək lazım olan test çərçivələrində faydalı ola bilər. Ancaq bunu etmək üçün bu metodun necə davrandığını (yəni, hansı növləri qaytardığını) başa düşməlisiniz.
main
Yuxarıdakı koddan metodu həyata keçirməyin ikinci yolu var :
public static void main (String[] args) {
for (Method method : HelloWorld.class.getDeclaredMethods()) {
System.out.println(method.getReturnType() == Void.TYPE);
}
}
Aralarındakı fərqin kifayət qədər maraqlı müzakirəsini stackoverflow-da oxumaq olar:
java.lang.Void və void arasındakı fərq nədir? #Viaçeslav
GO TO FULL VERSION