为什么Java不存储方法在system.out.println时计算的值?

时间:2017-03-10 07:28:10

标签: java methods return system.out

我对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

5 个答案:

答案 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。此时(赋值)值“保持”。你在这里执行的链是:

  • 将5放在a
  • 中的变量b
  • 将0指定为从methodB
  • 返回的值
  • 在我们离开methodB
  • 时放弃变量b
  • 返回methodB
  • 将指定值(0)分配给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;
}
}