[英]Why there is need of return statement
我很愚蠢地怀疑为什么我们在 method 中使用 return 语句。 在方法中不使用 return 语句,我们也可以获取所需的值作为示例
package testing;
public class ReturnMethod {
static int a = 10;
static int b = 5;
static int c;
static int d;
public static void add() {
c = a + b;
}
public static int returnAddValue() {
d = a + b;
return d;
}
public static void main(String[] args) {
add();
System.out.println("c: " + c);
int value = returnAddValue();
System.out.println("value: " + value);
}
}
在上面的例子中,在这两种情况下我都得到输出
c: 15
value: 15
所以我怀疑何时使用 return 语句以及为什么需要
使用return statement
, return value
不需要保存在任何全局、外部或成员变量中。
但是,如果没有return statement
您必须准备一种outer
变量值来跟踪它。
如果将方法的结果分配给静态变量(并且实际上通过设置静态变量传入方法的“参数”),则当两个线程同时调用该方法时会出现问题,因为变量是共享的对于方法的所有调用:
Thread t1 = new Thread(() -> {a = 1; b = 2; add(); }); t1.start();
Thread t2 = new Thread(() -> {a = 3; b = 4; add(); }); t2.start();
t1.join(); t2.join();
您不知道这些线程中的哪一个先运行,或者它们是否同时运行; 所以你不知道当你调用add()
时a
或b
的值是什么,也不知道之后c
的值是第一个或第二个线程中调用的结果(或二)。
之后存储在c
的值可以是3
、 5
或7
任何一个(或任何其他值,如果还有另一个线程也在此代码之外同时调用add()
。
如果您将值保持在堆栈中,通过将a
和b
作为方法参数传递,并将结果作为返回值接收,那么线程干扰的问题就完全消失了。
即使您的代码是单线程的,也很难编写:
a = 1;
b = 2;
add();
int result = c;
而不是
int result = add(1, 2);
当您需要该方法返回值时,您应该使用 return 语句。
在您的情况下,这两种方法都有效。
但是,当您不希望您的类的字段被另一个类更改时,您可以并且应该使用返回方法。
例如,在制作银行账户相关软件时,您希望money
只被看到,而不能被更改。 因此,您将money
私有,并创建了一个返回钱的方法。 这样一来,其他类只能看到钱,但不能改变它。
首先,您的功能不同,如您所见
public static **void** add()
public static **int** returnAddValue()
第一个不返回任何内容,因为它的返回类型为 void,而第二个的返回类型为 int。 第一个有效,因为 c 是一个全局变量。
当您不将结果存储在类的(静态)变量中时,您通常会使用 return 。
public class ReturnMethod {
static int a = 10;
static int b = 5;
public static void add() {
int c = a + b;
}
public static int returnAddValue() {
int d = a + b;
return d;
}
public static void main(String[] args) {
add();
//not possible to access c here
//System.out.println("c: " + c);
int value = returnAddValue();
System.out.println("value: " + value);
}
}
在修改后的示例中,您将无法访问 add() 方法的结果。
您可能应该阅读Java 中的作用域。
你有一个类变量 c & d。 这些变量与类相关联并存储在堆中。 如果您为其分配一个值,并且无需显式 return 语句即可访问它。 但是,如果您在方法中声明了 d,则需要 return 语句将值返回给调用者。
您能够访问类变量 c 的值的原因是它已被初始化为静态。 如果不是这种情况,一旦 add 方法结束,c 变量中的信息就会丢失。 方法有返回值的原因是它们用户可以获得更新的值,如果对象数据中有任何操作。 在这种情况下有一个非常小的,如果有一系列的数据操作怎么办。 在这种情况下,最终值必须返回给调用对象,没有 return 语句是不可能的。
代码片段中的变量 C 始终在类中访问,并将一直保留到类的对象存在。 所以你可以在方法之外打印变量 C 的值。
但是,如果您在add()
方法中声明了一个局部变量,则打印语句System.out.println("c: " + c);
将打印变量c
的默认值。 在这种情况下为零。
它完全取决于我们的要求是从我们的方法返回一个值还是更新实例变量。 有时我们只想处理一个值并返回结果,结果将以不同的方式使用,在这种情况下,我们需要从方法返回值。
例如
java.lang.Math.sqrt(double a) 方法返回一个值,我们根据需要或要求使用返回值。 你能想到如果这个方法没有返回任何值那么它应该更新什么吗?如果它没有返回任何值,我认为这个方法没用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.