我对return
关键字的概念以及它的行为方式感到困惑。我一直在玩,发现了一些我无法解释的行为。
在下面的代码中,我有一个简单的calculateScore()
方法,它有一个公式。当第一个方法调用calculateScore()
时,我要求它打印出结果以跟踪我的数字发生了什么。我用不同的值做了两次。
我的问题是:为什么highscore
的值在第一行代码后消失了?
此后它只返回0
的返回值,然后在第二次调用时再次重复此过程。我不明白。
如果我将highscore
定义为值,那为什么它的值会消失?如果我要返回return
,为什么finalScore
会保留它?谢谢。
public class Main {
public static void main(String[] args) {
int highScore = calculateScore(true, 800, 5, 100);
System.out.println("Your Final Score was " + highScore);
System.out.println(highScore);
highScore = calculateScore(true, 10000, 8, 200);
System.out.println("Your Final Score was " + highScore);
System.out.println(highScore);
}
public static int calculateScore(boolean gameOver,
int score, int levelCompleted, int bonus) {
if (gameOver) {
int finalScore = score + (levelCompleted * bonus);
finalScore +=2000;
System.out.println(finalScore);
}
return 0;
}
}
这是输出:
Result
3300
Your Final Score was 0
0
13600
Your Final Score was 0
0
答案 0 :(得分:1)
嗯,你需要改变你认为这种方式的方式。
在方法中定义的变量仅在该方法中保留该值。
return
的含义不是“保持”或“存储”。它意味着“将此值传递给调用此方法的方法,然后返回到调用它的位置”。
所以当你有
时void methodA() {
int a = methodB();
System.out.println(a);
}
int methodB() {
int b = 5;
return 0;
}
然后当methodA
调用methodB
时,执行进入methodB
的第一行,它给变量一个数字(但从不使用它),然后是{{1 }}告诉它返回的值是0,然后它离开return
并返回methodB
中的调用,并将methodA
交给变量0
。此时(赋值)值“保持”。你在这里执行的链是:
a
b
中
methodB
methodB
b
methodB
methodA
a
methodA
。答案 1 :(得分:0)
首先观察:在calculateScore()
中,您在finalScore
方法中使用名为main()
的变量 - 使用highScore
- 所以即使您的推理是正确的,这两个变量& #39;名字不匹配。
但即使名称相同,您也会得到相同的结果,因为java中的变量不是全局变量而是具有范围。根据经验:当在{}
中包含的块中声明变量时,只有在此块中才知道它,并且一旦执行离开块,就会消失。这就是为什么我们有return
- 语句:当你的方法需要向调用方法提供一个结果时,它return
,然后调用方法可以将它分配给它自己的变量。
答案 2 :(得分:0)
我喜欢将return
视为该方法所代表的值。
您会看到calculateScore
如何像变量值一样使用?
int highScore = calculateScore(true, 800, 5, 100);
您无法使用其他方法执行此操作,例如System.out.println
:
int highScore = System.out.println(); // does not compile
这是因为calculateScore
的签名表示它返回int
,即它可以“表示”整数值。但它究竟代表什么价值?这一切都取决于return
声明。在这里,你的退货声明说:
return 0;
这意味着该方法始终代表0
的值。换句话说,
int highScore = calculateScore(true, 800, 5, 100);
与
相同int highScore = 0;
这就是第二行输出显示为0的原因。
那么应该该方法代表什么值?当然,finalScore
变量的值!但显然你只计算gameOver
的高分。您应该在if
语句旁边添加一个新的return语句:
if (gameOver) {
// your original formula and stuff
return finalScore;
}
请记住保留return 0
语句,因为如果gameOver
为假,该怎么办?该方法代表什么价值?它不能代表什么,因为方法签名表示它代表int
。所以我认为最合适的事情是return 0
。
答案 3 :(得分:0)
public static int calculateScore(boolean gameOver,
int score, int levelCompleted, int bonus) {
int finalScore = 0;
if (gameOver) {
finalScore = (score + (levelCompleted * bonus));
finalScore +=2000;
}
return finalScore ;
}
在您的calculateScore方法中,您始终返回0.如果您想将计算金额作为分数。你必须从你的方法中返回它。您必须在方法的开头初始化finalScore变量。
答案 4 :(得分:-1)
返回的内容是传回一个值,以便可以使用它。
你告诉你的函数打印finalScore,但最后你只传递数字0的值;变量接收值0,完全忽略它计算的内容并在控制台上显示。这就是为什么当你使用System.out.println(highScore);
打印时总是得到0。
只需将0
替换为finalScore
即可使其正常运行。
public class Main {
public static void main(String[] args) {
int highScore = calculateScore(true, 800, 5, 100);
System.out.println("Your Final Score was " + highScore);
System.out.println(highScore);
highScore = calculateScore(true, 10000, 8, 200);
System.out.println("Your Final Score was " + highScore);
System.out.println(highScore);
}
public static int calculateScore(boolean gameOver,
int score, int levelCompleted, int bonus) {
if (gameOver) {
int finalScore = score + (levelCompleted * bonus);
finalScore +=2000;
System.out.println(finalScore);
}
return finalScore;
}
}