众所周知,Java 语言是一种面向对象的编程语言。换句话说,基础概念,即基础的基础,就是万物皆对象。对象是使用类来描述的。反过来,类定义状态和行为。例如,银行账户可能具有账户金额形式的状态,并具有增加和减少账户余额的行为。在 Java 中,行为是通过方法实现的。学习如何定义方法是您学习 Java 的最开始。例如,在 Oracle 的官方教程中,在“ Defining Methods ”标题下。这里有两件重要的事情需要注意:
  • 每个方法都有一个签名。签名由方法名称及其输入参数组成。
  • 必须为方法指定返回类型。您在方法声明中声明方法的返回类型。
返回类型不是方法签名的一部分。同样,这是因为 Java 是一种强类型语言,编译器希望尽可能提前知道使用了哪些类型以及在哪里使用。同样,这是为了避免我们犯错。基本上,这都是为了一个好的事业。在我看来,这再次向我们灌输了一种处理数据的文化。因此,为方法指定了返回值的类型。Java 中的return关键字用于实际返回。 Java return 关键字 - 1

Java 中 return 的作用是什么

return关键字是一个控制流语句,如此处的Oracle 教程中所述。您还可以在官方教程的“从方法返回值”部分了解如何返回值。编译器会仔细跟踪它是否可以确保方法的返回值与方法指定的返回类型相匹配。让我们使用Tutorialspoint 的在线 IDE 来考虑一个例子。让我们看一下原始示例:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
可以看到,这里执行了main方法,是程序的入口。代码行从上到下执行。我们的主要方法不能返回值。如果我们试图在那里返回一个值,我们将得到一个错误:“错误:Main 方法必须返回一个类型为 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);
        }
    }
    
}
从示例中可以看出,如果调用不带参数的 Java 程序中的main方法,我们将中断该方法。重要的是要记住,如果您在return语句之后有代码,它将不可访问。我们的智能编译器会注意到它并阻止您运行这样的程序。例如,这段代码无法编译:

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");
 }
有一个肮脏的技巧可以解决这个问题。例如,出于调试目的,或出于某些其他原因。上面的代码可以通过将return语句包装在if块中来修复:

if (2==2) {
    return;
}

错误处理期间的返回语句

还有其他一些非常棘手的事情——我们可以将return与错误处理结合使用。我想马上说在catch块中使用return语句是非常非常糟糕的形式,所以你应该避免它。但我们需要一个例子,对吧?这里是:

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包含一个对象,我们在finally块中说value = null。然后该对象,而不是 null,将在catch块中返回。但是return语句在finally块中可以正常工作。显然,您的同事不会因为涉及退货单的小惊喜而感谢您。

void.class

最后。您可以编写一个奇怪的结构:void.class。唔。为什么以及它是什么意思?确实存在涉及Java 反射 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);
        }
 }
您可以在 Stack Overflow 上阅读关于两者之间差异的非常有趣的讨论:What is the difference between java.lang.Void and void?