Java 为什么需要返回语句
我非常愚蠢地怀疑为什么我们在方法中使用return语句。在方法中不使用return语句,我们也可以得到所需的值 举例来说Java 为什么需要返回语句,java,Java,我非常愚蠢地怀疑为什么我们在方法中使用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; }
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语句,返回值不必保存在任何全局、外部或成员变量中
但是,如果没有返回语句
,您必须准备一种外部
变量值来跟踪它。当您需要返回值的方法时,您应该使用返回语句
在您的情况下,两种方法都有效。
但是,当您不希望类的某个字段被另一个类更改时,您可以并且应该使用返回方法
例如,在制作与银行账户相关的软件时,您只希望看到而不希望更改货币。因此,您将money
设为private,并创建一个返回钱的方法。这样,其他类只能看到钱,而不能改变它。首先,正如您所看到的,您的函数是不同的
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()方法的结果
您可能应该阅读。您有一个类变量c&d。这些变量与类关联并存储在堆中。如果您将一个值赋回它,并且可以在没有显式返回语句的情况下访问它。但是,如果您在方法中声明了d,则需要return语句将值返回给调用方。如果您将方法的结果分配给静态变量(实际上,通过设置静态变量传入方法的“参数”),则当两个线程同时调用该方法时,您会遇到问题,由于变量对于方法的所有调用都是共享的:
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);
您能够访问类变量c的值的原因是它已初始化为静态。如果不是这种情况,c变量中的信息将在add方法结束后立即丢失。方法具有返回值的原因是,如果对象中存在任何操作,则用户可以获取更新的值数据。在这种情况下,有一个非常小的变量,如果对数据进行了一系列操作会怎么样。在这种情况下,最终值必须返回给调用对象,而不使用return语句是不可能的。代码段中的变量C在整个类中都会被访问,并且会一直保留到类的对象存在为止。因此可以在方法外部打印变量C的值
但是,如果您在方法add()
中声明了一个局部变量,则打印语句System.out.println(“c:+c”);
将打印变量c
的默认值。在这种情况下,默认值为零。这完全取决于我们的要求,是从方法返回值还是更新实例变量。有时我们只想处理一个值并返回结果,结果将以不同的方式使用,在这种情况下,我们需要方法的返回值
例如
java.lang.Math.sqrt(double a)方法返回一个值,我们根据需要或要求使用返回的值。您认为如果这个方法没有返回任何值,那么它应该更新什么,我认为如果它没有返回任何值,这个方法是无用的
但这并不能回答问题,但我得到的是输出,c:15,value:15,这在每种情况下都是相同的是,但这只是因为您将结果保存在类的静态变量中。如果您仔细查看我的示例,我从类中删除了c和d的变量定义,因此无法访问c(您想要的结果)在main方法中,这就是我将其注释掉的原因。+1,因为这是唯一一个解释使用静态变量存储其结果的代码充满危险的答案。