معرفی
همانطور که می دانیم جاوا یک زبان برنامه نویسی شی گرا است. یعنی مفهوم اساسی، زیرا گفتن اساس مبانی این است که همه چیز یک شی است. اشیاء با استفاده از کلاس ها توصیف می شوند.
طبقات به نوبه خود حالت و رفتار دارند. به عنوان مثال، یک حساب بانکی ممکن است حالتی به شکل مقدار پول موجود در حساب داشته باشد و رفتار افزایش و کاهش موجودی داشته باشد. رفتار در جاوا با استفاده از روش ها پیاده سازی می شود. نحوه توصیف روش ها در همان ابتدای سفر یادگیری جاوا شما معرفی شده است. به عنوان مثال، در آموزش رسمی اوراکل: "
تعریف روش ها ". در اینجا دو جنبه مهم وجود دارد:
- هر روش یک امضا دارد. امضا شامل نام روش و پارامترهای ورودی آن است.
- متدها باید نوع بازگشتی را مشخص کنند.
- نوع برگشتی بخشی از امضای متد نیست.
باز هم، این نتیجه این واقعیت است که جاوا یک زبان قوی تایپ شده است و کامپایلر می خواهد از قبل بفهمد که کدام نوع تا آنجا که ممکن است استفاده می شود. باز هم برای محافظت از ما در برابر اشتباهات. به طور کلی، همه چیز به نفع است. خوب، به نظر من، این یک بار دیگر فرهنگ مدیریت داده ها را در ما القا می کند. بنابراین، برای متدها نوع مقدار مشخص شده است. و برای برگرداندن همین مقدار از متدها از کلمه کلیدی استفاده می شود
return
.
عبارت بازگشت کلمه کلیدی در جاوا
کلمه کلیدی عبارت
return
به "گزاره های جریان کنترل" همانطور که در آموزش اوراکل "
بیانیه های جریان کنترل " بحث شده است، اشاره دارد. همچنین می توانید در مورد نحوه برگرداندن مقادیر در آموزش رسمی بخوانید: "
بازگرداندن یک مقدار از یک روش ". کامپایلر به دقت نظارت می کند، تا جایی که می تواند، مقدار بازگشتی از یک متد با نوع مقدار بازگشتی مشخص شده توسط متد مطابقت داشته باشد.
بیایید از IDE آنلاین از tutorialspoint به عنوان مثال استفاده کنیم. بیایید به مثال اصلی نگاه کنیم:
public class HelloWorld {
public static void main(String []args) {
System.out.println("Hello World");
}
}
همانطور که می بینیم، یک متد در اینجا اجرا می شود
main
که نقطه ورود به برنامه است. خطوط کد از بالا به پایین اجرا می شوند. روش ما
main
نمی تواند مقادیر را برگرداند، در غیر این صورت یک خطا دریافت خواهیم کرد: "
Error: Main method must return a value of type void
". بنابراین، روش به سادگی به صفحه نمایش داده می شود. حال بیایید دریافت رشته را به یک روش جداگانه برای دریافت پیام منتقل کنیم:
public class HelloWorld {
public static void main(String []args) {
System.out.println(getHelloMessage());
}
public static String getHelloMessage() {
return "Hello World";
}
}
همانطور که می بینیم با استفاده از کلمه کلیدی
return
مقدار بازگشتی را مشخص کردیم که بعداً در متد استفاده کردیم
println
. در توضیح (تعریف) روش،
getHelloMessage
نشان دادیم که ما را برمی گرداند
String
. این به کامپایلر اجازه می دهد تا بررسی کند که اقدامات متد با روشی که اعلام شده است مطابقت دارد. به طور طبیعی، نوع مقدار بازگشتی مشخص شده در تعریف روش میتواند وسیعتر از نوع مقدار بازگشتی از کد باشد. نکته اصلی این است که انواع به یکدیگر کاهش می یابد. در غیر این صورت یک خطای زمان کامپایل دریافت خواهیم کرد: "
error: incompatible types
". به هر حال، احتمالاً بلافاصله این سؤال مطرح شد: چرا
return
برای اپراتورهای کنترل جریان برنامه اعمال می شود؟ اما چون می تواند جریان عادی برنامه را از بالا به پایین مختل کند. مثلا:
public class HelloWorld {
public static void main(String []args){
if (args.length == 0) {
return;
}
for (String arg : args) {
System.out.println(arg);
}
}
}
همانطور که از مثال مشخص است، اگر برنامه جاوا ما بدون پارامتر فراخوانی شود، اجرای متد را قطع می کنیم
main
. مهم است که به یاد داشته باشید که اگر
return
کد را داشته باشید، غیرقابل دسترسی می شود. و کامپایلر هوشمند ما متوجه این موضوع می شود و به شما اجازه اجرای چنین برنامه ای را نمی دهد. به عنوان مثال، این کد کامپایل نمی شود:
public static void main(String []args) {
System.out.println("1");
return;
System.out.println("2");
}
یک هک کثیف برای دور زدن این وجود دارد. به عنوان مثال، برای اهداف اشکال زدایی یا به دلایل دیگر. کد بالا را می توان با قرار دادن آن
return
در
if
یک بلوک برطرف کرد:
if (2==2) {
return;
}
بیانیه بازگشت در رسیدگی به خطا
یک شرایط بسیار دشوار وجود دارد - ما می توانیم از آن
return
در ارتباط با مدیریت خطا استفاده کنیم. من می خواهم بلافاصله بگویم که استفاده از آن
return
در
catch
یک بلوک بسیار بسیار بد است، بنابراین باید از آن اجتناب کنید. اما ما به یک مثال نیاز داریم، درست است؟ او اینجا است:
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);
}
}
}
در نگاه اول به نظر می رسد که 2 باید برگردانده شود، زیرا
finally
همیشه اجرا می شود. اما خیر، مقدار 1 خواهد بود و تغییر به متغیر in
finally
نادیده گرفته می شود. علاوه بر این، اگر
value
حاوی یک شی بود و ما
finally
گفتیم
value = null
،
catch
باز هم ارجاع به شی را برمیگرداند، نه
null
. اما از بلوک
finally
اپراتور
return
به درستی کار می کرد. همکاران به وضوح از شما برای چنین هدیه ای تشکر نمی کنند.
void.class
و در نهایت. شما می توانید یک ساخت عجیب و غریب مانند
void.class
. به نظر می رسد، چرا و چه چیزی است؟ در واقع، در چارچوبهای مختلف و موارد دشواری که از
Java Reflection API استفاده میشود ، این ممکن است بسیار ضروری باشد. به عنوان مثال، می توانید بررسی کنید که یک متد چه نوع را برمی گرداند:
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);
}
}
}
این می تواند در چارچوب های آزمایشی مفید باشد که در آن نیاز به جایگزینی کد واقعی روش ها است. اما برای انجام این کار، باید بدانید که این روش چگونه رفتار می کند (یعنی چه نوع هایی را برمی گرداند). راه دومی برای پیاده سازی متد
main
از کد بالا وجود دارد:
public static void main (String[] args) {
for (Method method : HelloWorld.class.getDeclaredMethods()) {
System.out.println(method.getReturnType() == Void.TYPE);
}
}
یک بحث نسبتاً جالب در مورد تفاوت بین آنها را می توان در stackoverflow خواند:
تفاوت بین java.lang.Void و void چیست؟ #ویاچسلاو
GO TO FULL VERSION