Както знаем, езикът Java е обектно-ориентиран език за програмиране. С други думи, фундаменталната концепция, т.е. основата на основата, е, че всичко е обект. Обектите се описват с помощта на класове. Класовете от своя страна определят състоянието и поведението. Например банкова сметка може да има състояние под формата на парична сума в сметката и да има поведение, което увеличава и намалява салдото по сметката. В Java поведението се реализира чрез методи. Да се научите How да дефинирате методи идва в самото начало на вашето изучаване на Java. Например в официалния урок на Oracle, под заглавието „ Дефиниране на методи “. Има две важни неща, които трябва да имате предвид тук:
- Всеки метод има сигнатура. Сигнатурата се състои от името на метода и неговите входни параметри.
- За методите трябва да бъде указан тип на връщане. Вие декларирате връщания тип на метод в неговата декларация на метода.

Какво прави return в Java
Ключовата дума return е команда за контролен поток, Howто е описано в ръководството за Oracle тук . Можете също да прочетете How да върнете стойности в раздела „ Връщане на стойност от метод “ на официалния урок. Компилаторът внимателно следи дали може да гарантира, че върнатата стойност на метода съвпада с посочения тип връщане на метода. Нека използваме онлайн IDE на Tutorialspoint , за да разгледаме пример. Нека да разгледаме първичния пример:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
Както виждаме, тук се изпълнява главният метод, който е входната точка на програмата. Редовете code се изпълняват отгоре надолу. Основният ни метод не може да върне стойност. Ако се опитаме да върнем стойност там, ще получим грешка: „Грешка: Основният метод трябва да върне стойност от тип 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 . Това позволява на компилатора да провери дали действията на метода са в съответствие с начина, по който е деклариран. Естествено, типът на връщане, указан в декларацията на метода, може да бъде по-широк от типа на действително върнатата стойност в codeа, т.е. важното е, че е възможно преобразуване на типа. В противен случай ще получим грешка по време на компorране: „Грешка: несъвместими типове“ . Между другото, вероятно имате въпрос: Защо е връщанетосе счита за израз на контролен поток? Тъй като може да наруши нормалния поток отгоре надолу на програмата. Пример:
public class HelloWorld {
public static void main(String[] args) {
if (args.length == 0) {
return;
}
for (String arg : args) {
System.out.println(arg);
}
}
}
Както можете да видите от примера, ние прекъсваме основния метод в Java програма, ако се извика без аргументи. Важно е да запомните, че ако имате code след оператор за връщане , той няма да бъде достъпен. Нашият интелигентен компилатор ще го забележи и ще ви попречи да стартирате такава програма. Например този code не се компorра:
public static void main(String[] args) {
System.out.println("1");
return;
// we use output method after return statement, which is incorrect
System.out.println("2");
}
Има един мръсен хак, за да заобиколите това. Например за целите на отстраняване на грешки or по няHowва друга причина. Кодът по-горе може да бъде коригиран чрез опаковане на израза return в if блок:
if (2==2) {
return;
}
Изявление за връщане по време на обработка на грешка
Има още нещо много сложно — можем да използваме return във връзка с обработка на грешки. Искам веднага да кажа, че използването на израз за връщане в catch блок е много, много лоша форма, така че трябва да го избягвате. Но имаме нужда от пример, нали? Ето го:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Value: " + getIntValue());
}
public static int getIntValue() {
int value = 1;
try {
System.out.println("Something terrible happens");
throw new Exception();
} catch (Exception e) {
System.out.println("Cached value: " + value);
return value;
} finally {
value++;
System.out.println("New value: " + value);
}
}
}
На пръв поглед изглежда, че трябва да се върне 2, тъй като finally винаги се изпълнява. Но не, върнатата стойност ще бъде 1 и промяната на променливата в блока finally ще бъде игнорирана. Нещо повече, да предположим, че тази стойност съдържа обект и казваме value = null в блока finally . Тогава този обект, а не null, ще бъде върнат в блока catch . Но операторът за връщане ще работи правилно в блока finally . Очевидно вашите колеги няма да ви благодарят за малки изненади, включващи изявления за връщане.
void.class
И накрая. Има тази странна конструкция, която можете да напишете: void.class . Хм. Защо и Howво означава? Наистина има различни рамки и трудни случаи, включващи Java Reflection API , където това може да бъде много полезно. Например можете да проверите Howъв тип връща даден метод:
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);
}
}
}
Това може да бъде полезно в тестови рамки, където трябва да замените действителния code в методите. Но за да направите това, трябва да разберете How се държи даден метод (т.е. Howъв тип връща). Има и втори начин за прилагане на основния метод в codeа по-горе:
public static void main(String[] args) {
for (Method method : HelloWorld.class.getDeclaredMethods()) {
System.out.println(method.getReturnType() == Void.TYPE);
}
}
Можете да прочетете доста интересна дискусия за разликата между двете в Stack Overflow: Каква е разликата между java.lang.Void и void?
GO TO FULL VERSION