Kirish
Ma'lumki, Java - bu ob'ektga yo'naltirilgan dasturlash tili. Ya'ni, asosiy tushuncha, chunki asoslarning asosini aytish uchun hamma narsa ob'ektdir. Ob'ektlar sinflar yordamida tavsiflanadi.
Sinflar, o'z navbatida, holat va xatti-harakatlarga ega. Misol uchun, bank hisobvarag'i hisobdagi pul miqdori ko'rinishidagi holatga ega bo'lishi va balansni oshirish va kamaytirish xatti-harakatlariga ega bo'lishi mumkin. Java-da xatti-harakatlar usullar yordamida amalga oshiriladi. Usullarni qanday tasvirlash Java o'rganish sayohatingizning boshida kiritiladi. Misol uchun, Oracle-dan rasmiy qo'llanmada: "
Usullarni aniqlash ". Bu erda ikkita muhim jihat bor:
- Har bir usulning imzosi bor. Imzo usul nomi va uning kiritish parametrlaridan iborat;
- Usullar qaytarish turini ko'rsatishi kerak;
- Qaytish turi usul imzosining bir qismi emas.
Shunga qaramay, bu Java juda qattiq terilgan til ekanligi va kompilyator iloji boricha qayerda ishlatilishini oldindan tushunishni xohlashining natijasidir. Yana bizni xatolardan himoya qilish uchun. Umuman olganda, hamma narsa yaxshilik uchun. Menimcha, bu bizga ma'lumotlar bilan ishlash madaniyatini yana bir bor singdiradi. Shunday qilib, usullar uchun qiymat turi ko'rsatilgan. Va usullardan xuddi shu qiymatni qaytarish uchun kalit so'z ishlatiladi
return
.
Java-da kalit so'zni qaytarish bayonoti
Bayonot kalit so'zi Oracle o'quv qo'llanmasida muhokama qilinganidek, "
boshqaruv oqimi bayonotlarireturn
" ni anglatadi . Shuningdek, siz qiymatlarni qanday qaytarish haqida rasmiy qo'llanmada o'qishingiz mumkin: "
Usuldan qiymatni qaytarish ". Kompilyator usulidan qaytarilgan qiymat usul tomonidan ko'rsatilgan qaytariladigan qiymat turiga mos kelishini imkoni boricha diqqat bilan kuzatib boradi. Misol sifatida tutorialspoint dan
Onlayn IDE dan foydalanamiz. Keling, asl misolni ko'rib chiqaylik:
public class HelloWorld {
public static void main(String []args) {
System.out.println("Hello World");
}
}
Ko'rib turganimizdek, bu erda
main
dasturga kirish nuqtasi bo'lgan usul bajariladi. Kod satrlari yuqoridan pastgacha bajariladi. Bizning
main
usulimiz qiymatlarni qaytara olmaydi, aks holda biz xatoga duch kelamiz: "
Error: Main method must return a value of type void
". Shuning uchun, usul shunchaki ekranga chiqadi. Keling, satrni qabul qilishni xabarni qabul qilishning alohida usuliga o'tkazamiz:
public class HelloWorld {
public static void main(String []args) {
System.out.println(getHelloMessage());
}
public static String getHelloMessage() {
return "Hello World";
}
}
Ko'rib turganimizdek, kalit so'zdan foydalanib,
return
biz keyinroq usulda qo'llagan qaytish qiymatini ko'rsatdik
println
. Usulning tavsifida (ta'rifida)
getHelloMessage
biz u bizga qaytib kelishini ko'rsatdik
String
. Bu kompilyatorga usulning harakatlari e'lon qilingan usulga mos kelishini tekshirish imkonini beradi. Tabiiyki, usul ta'rifida ko'rsatilgan qaytarish qiymatining turi koddan qaytarilgan qiymat turidan kengroq bo'lishi mumkin, ya'ni. Asosiysi, turlar bir-biriga qisqartiriladi. Aks holda biz kompilyatsiya vaqti xatosini olamiz: "
error: incompatible types
". Aytgancha, ehtimol darhol savol tug'ildi: Nima uchun
return
u dastur oqimini boshqarish operatorlariga tegishli? Lekin, chunki u yuqoridan pastgacha dasturning normal oqimini buzishi mumkin. Masalan:
public class HelloWorld {
public static void main(String []args){
if (args.length == 0) {
return;
}
for (String arg : args) {
System.out.println(arg);
}
}
}
Misoldan ko'rinib turibdiki,
main
agar java dasturimiz parametrlarsiz chaqirilsa, usulning bajarilishini to'xtatamiz. Shuni yodda tutish kerakki, agar sizda
return
kod mavjud bo'lsa, unga kirish imkoni bo'lmaydi. Va bizning aqlli kompilyatorimiz buni sezadi va bunday dasturni ishga tushirishga ruxsat bermaydi. Masalan, ushbu kod kompilyatsiya qilinmaydi:
public static void main(String []args) {
System.out.println("1");
return;
System.out.println("2");
}
Buni aylanib o'tish uchun iflos hack bor. Masalan, disk raskadrovka maqsadida yoki boshqa sabablarga ko'ra.
return
Yuqoridagi kodni blokga o'rash orqali tuzatish mumkin
if
:
if (2==2) {
return;
}
Xatolarni qayta ishlashda qaytarish bayonoti
Bitta juda qiyin vaziyat bor - biz uni
return
xatolarni boshqarish bilan birgalikda ishlatishimiz mumkin. Darhol aytmoqchimanki, uni
return
blokda ishlatish
catch
juda va juda yomon shakl, shuning uchun siz undan qochishingiz kerak. Ammo bizga misol kerak, to'g'rimi? Mana u:
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);
}
}
}
Bir qarashda, 2 ni qaytarish kerakdek tuyuladi, chunki
finally
u har doim bajariladi. Lekin yo'q, qiymat 1 bo'ladi va o'zgaruvchining o'zgarishi
finally
e'tiborga olinmaydi. Bundan tashqari, agar u
value
ob'ektni o'z ichiga olgan bo'lsa va biz
finally
aytgan bo'lsak
value = null
, u
catch
ob'ektga emas, balki havolani qaytaradi
null
. Lekin blokdan
finally
operator
return
to'g'ri ishlagan bo'lardi. Hamkasblar bunday sovg'a uchun sizga rahmat aytishmaydi.
bekor.sinf
Va nihoyat. kabi g'alati konstruktsiyani yozishingiz mumkin
void.class
. Ko'rinishidan, nima uchun va nima maqsadda? Aslida,
Java Reflection API ishlatiladigan turli xil ramkalar va qiyin holatlarda bu juda zarur bo'lishi mumkin. Masalan, qanday turdagi usul qaytarilishini tekshirishingiz mumkin:
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 haqiqiy usullar kodini almashtirish zarur bo'lgan test tizimlarida foydali bo'lishi mumkin. Lekin buning uchun siz ushbu usul qanday harakat qilishini tushunishingiz kerak (ya'ni, u qanday turlarni qaytaradi).
main
Yuqoridagi koddan usulni amalga oshirishning ikkinchi usuli mavjud :
public static void main (String[] args) {
for (Method method : HelloWorld.class.getDeclaredMethods()) {
System.out.println(method.getReturnType() == Void.TYPE);
}
}
Ularning orasidagi farq haqida juda qiziqarli muhokamani stackoverflow-da o'qish mumkin:
java.lang.Void va void o'rtasidagi farq nima? #Viacheslav
GO TO FULL VERSION