CodeGym/Java блог/Случаен/Ключова дума за връщане на Java
John Squirrels
Ниво
San Francisco

Ключова дума за връщане на Java

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

Какво прави 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?
Коментари
  • Популярен
  • Нов
  • Стар
Трябва да сте влезли, за да оставите коментар
Тази страница все още няма коментари