介绍
众所周知,Java是一种面向对象的编程语言。也就是基本概念,因为 说基础的基础就是一切都是对象。对象是使用类来描述的。
反过来,类也有状态和行为。例如,银行帐户可能具有帐户中金额形式的状态,并具有增加和减少余额的行为。Java 中的行为是使用方法来实现的。如何描述方法是在 Java 学习之旅的一开始就介绍的。例如Oracle的官方教程:“
定义方法”。这里有两个重要的方面:
- 每个方法都有一个签名。签名由方法名及其输入参数组成;
- 方法必须指定返回类型;
- 返回类型不是方法签名的一部分。
同样,这是 Java 是一种强类型语言这一事实的结果,编译器希望提前了解尽可能多地使用哪些类型。再次,保护我们免受错误的影响。总的来说,一切都是为了好的。嗯,在我看来,这再次向我们灌输了处理数据的文化。因此,对于方法,值类型是指定的。要从方法返回相同的值,请使用关键字
return
。
Java中的关键字return语句
statements 关键字
return
指的是“控制流语句”,如 oracle 教程“
控制流语句”中讨论的那样。您还可以在官方教程中阅读如何返回值:“
Returning a Value from a Method ”。编译器会尽其所能仔细监视方法返回的值是否与该方法指定的返回值类型匹配。让我们使用教程点的
在线 IDE作为示例。我们看一下原来的例子:
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
我们表明它将返回 us
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
从示例中可以看出,如果我们的java程序不带参数调用, 我们就会中断方法的执行。请务必记住,如果您
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
. 看起来,为什么以及有什么意义呢?事实上,在使用
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 上阅读:
What is the Difference Between java.lang.Void and void? #维亚切斯拉夫
GO TO FULL VERSION