【问题标题】:Java When outputting String and method return, why does method return output first?Java输出String和方法返回时,为什么方法先返回输出?
【发布时间】:2014-04-06 20:57:35
【问题描述】:

在下面的代码中,如果字符串"Mult"出现在test1(4)方法调用之前,为什么方法在字符串之前输出?又为什么会反弹形式输出方法的第一部分,然后离开方法输出字符串,然后返回方法输出方法的返回值?

代码:

public class Scratch{
  public static void main(String[] args){
    System.out.println("Mult:" + test1(4));
  }

  public static int test1(int n){
    System.out.println("N:" + n);
    return n*2;
  }
}

输出:

N:4
Mult:8

【问题讨论】:

  • 您正在调用该方法,并且在该方法内部它首先打印出一些内容,因此为什么您有该输出
  • 抱歉,我不是在询问方法中的 1"--------------------\nN:"` 字符串。我在询问main 方法中的"Mult:" 字符串。

标签: java methods output


【解决方案1】:

首先要注意的是,当您将+ 与两个操作数一起使用时,其中两个操作数之一是String,表达式的结果是String

因此,在下面的方法调用表达式中

System.out.println("Mult:" + test1(4));

您正在调用PrintStream#println(String),因为outPrintStream 类型的变量。请注意该方法如何接受单个 String 参数。因此,String 必须从String 的串联中解析出来

"Mult:" + test1(4)

为此,必须执行test1(4) 方法。

public static int test1(int n){
    System.out.println("N:" + n);
    return n*2;
}

此方法再次使用PrintStream#println(String),但带有参数

"N:" + n

这是另一个产生String 值的String 连接

"N:4"

对于这个特定的调用。然后将生成的String 值用作println(..) 方法的参数,该方法将其输出到程序的标准输出。

然后该方法返回值8,因为4 * 2 = 8

该返回值是调用test1(4) 方法的值。所以

System.out.println("Mult:" + test1(4));

等价于

System.out.println("Mult:" + 8);

然后String发生串联,变换

"Mult:" + 8

进入String

"Mult:8"

然后将 String 用作 println(..) 方法的单个参数,该方法将其输出到程序的标准输出。

【讨论】:

    【解决方案2】:

    在下面的代码中,如果字符串“Mult”出现在test1(4)方法调用之前,为什么方法输出在字符串之前?

    因为您在使用“Mult:”部分调用 System.out.println 之前调用该方法。

    基本上,您的代码相当于:

    public static void main(String[] args){
      int tmp = test1(4); // This prints N:4 
      System.out.println("Mult:" + tmp);
    }
    

    如果你考虑一下,test1 方法必须在字符串连接发生之前完成(否则我们无法知道连接运算符的右侧是什么),并且字符串连接必须在 System.out.println 调用发生之前发生(否则我们不知道我们要打印什么)。有道理/

    【讨论】:

    • 也许还说 System.out.println 直到最后一个 ) 才会执行可能会有所帮助。
    • @Quincunx:老实说,我不确定在这种情况下会不会。
    • 我的意思是 println,而不是方法。但是将方法视为仅在我们到达相应的) 时才执行有助于确定执行顺序。基本上,) 将参数“发送”给方法,因此在它之前不会发送任何参数。
    • @Quincunx:我个人认为我的回答已经足够阐明这一点。当然,您可以随时添加自己的答案。
    • @StuartKuredjian:“要求它以不同的顺序连接”是什么意思?必须先评估字符串连接运算符的两个操作数,然后才能进行连接......在您的情况下,第二个操作数的评估具有打印“N:4”的副作用。
    【解决方案3】:

    什么时候

    System.out.println("Mult:" + test1(4));
    

    运行时,必须先评估 test1(4),然后才能使用 System.out.println'd。 因此,JVM 将运行以下内容:

    evalate result of test1(4) {
        print ("N:" + 4);
        return 2*4;
    }
    evalate result of "Mult:" + returnedValue {
        print("Multi:" + returnedValue);
    } 
    

    JVM 在知道它的值之前不能打印它。在这种情况下,首先评估 test1(4),以便 JVM 知道要打印出什么(返回值)。

    你也可以这样完成任务>>

    int result = test1(4); //This prints out 4 and evaluates to 8
    System.out.println("Mult: " + result); //This concats "Mult: " and 8 after converting it to of type String
    

    【讨论】:

    • 好吧,我想我明白了。所以test1() 被执行了。在test1() 内是对 println 的调用,它确实如此。但是没有要求该方法输出返回值;只有在被main 方法调用时才使用它的结果。然后,当按照我指定的顺序调用连接时,它会在内部 println 已经输出的情况下这样做。
    【解决方案4】:
    "Mult:" + test1(4)
    

    以上行是一个表达式,其值为"Mult:"test1(4) 的结果的串联。所以,为了能够知道这个连接的结果,test1(4) 被执行。此执行打印 "N:4",然后将 n 乘以 2,返回 8。然后将 8 与 "Mult:" 连接,并打印结果。

    【讨论】:

    • 我只是部分理解。如果你说在任何给定的表达式中,方法都在字符串之前执行,好的。但是根据您的解释,我理解因为表达式的结果依赖于计算,所以计算的结果首先附加到串联中,这个逻辑对我来说没有意义。表达式本身是说首先将"Mult:" 附加到concat。然后执行该方法,然后附加该方法的结果。所以还是有一些我不理解的逻辑。
    【解决方案5】:

    很明显。如果一个方法没有计算它的参数,它就不能完成。 在您的情况下, println 方法必须先计算其参数,然后才能执行。因此,对 test1 方法的函数调用首先完成。然后执行 main 中的语句。

    【讨论】:

    • 我理解一个表达式不能在所有部分都完成计算的逻辑,但我不明白追加顺序与计算顺序有什么关系。就此而言,我什至不明白为什么该方法需要先计算?命令是打印字符串,然后附加方法的返回值。为什么不能追加字符串,然后计算追加方法的返回值?
    • println 方法在字符串参数之后需要一个参数,并且您有一个方法调用来代替参数。您的 println 方法可以执行直到它有一个有效的参数。因此它等待方法调用被执行然后只有它可以被执行。阅读一点关于编译器和它的阶段。
    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多