Java 当返回作为参数传递给其他方法时,为什么首先调用方法?

Java 当返回作为参数传递给其他方法时,为什么首先调用方法?,java,Java,我创建了两个名为clz1(main)和clz2的类 clz1: clz2: 输出如下: What is your name:aaa What is your girlfriend's name:www Your name is aaa & your girlfriend's name is www String s = "Your name is " + print1() + " & your girlfriend's name is " + print2(); System.

我创建了两个名为clz1(main)和clz2的类

clz1:

clz2:

输出如下:

What is your name:aaa
What is your girlfriend's name:www
Your name is aaa & your girlfriend's name is www
String s = "Your name is " + print1() + " & your girlfriend's name is " + print2();
System.out.println(s);

这怎么可能呢?我没有调用
print1()
print2()
。。。首先打印“你的名字是”和print1()……然后打印“你女朋友的名字是”和print2()……不是吗?

你的输出是有意义的。您确实调用了
print1()
print2()
。你在这句话里叫他们:

System.out.println("Your name is "+print1()+" & your girlfriend's name is "+print2());
当该行执行时,效果是:首先调用
print1()
,然后调用
print2()
,然后使用它们的返回值(用户输入)构建较长的字符串,然后将该字符串传递给打印整个内容的
System.out.println()

发生这种情况的原因是,在将字符串参数传递给类似
System.out.println()
的方法之前,必须完全构建字符串参数——这就是Java的工作方式。
因此,在将字符串发送到
System.out.println()
之前,需要完全构建字符串的所有操作都会发生

如果你对这里的操作顺序感到困惑,有两种方法可以考虑。一个是上面的内容可以改写成这样:

What is your name:aaa
What is your girlfriend's name:www
Your name is aaa & your girlfriend's name is www
String s = "Your name is " + print1() + " & your girlfriend's name is " + print2();
System.out.println(s);
可以进一步细分为:

String s1 = print1();
String s2 = print2();
String s = "Your name is " + s1 + " & your girlfriend's name is " + s2;
System.out.println(s);
如果你看这个,顺序很清楚。这本质上就是正在发生的事情,您只是通过在一条语句中指定所有内容来走捷径

考虑它的第二种方式更具概念性:为了能够构建最终输出字符串并将其传递给
System.out.println()
,您必须知道
print1()
print2()
的返回值是什么,否则无法构建字符串!因此,它们必须首先被执行

如果您想了解技术,Java语言规范中有几个地方描述了这种行为。发件人:

调用方法或构造函数时(§15.12) 实际参数表达式初始化新创建的参数 每个声明类型的变量,在执行 方法或构造函数。


换句话说,Java将在
System.out.println()完成它的工作之前完全构建您的字符串,而在您的情况下,这需要调用您的print方法。

您的输出是有意义的。您确实调用了
print1()
print2()
。你在这句话里叫他们:

System.out.println("Your name is "+print1()+" & your girlfriend's name is "+print2());
当该行执行时,效果是:首先调用
print1()
,然后调用
print2()
,然后使用它们的返回值(用户输入)构建较长的字符串,然后将该字符串传递给打印整个内容的
System.out.println()

发生这种情况的原因是,在将字符串参数传递给类似
System.out.println()
的方法之前,必须完全构建字符串参数——这就是Java的工作方式。
因此,在将字符串发送到
System.out.println()
之前,需要完全构建字符串的所有操作都会发生

如果你对这里的操作顺序感到困惑,有两种方法可以考虑。一个是上面的内容可以改写成这样:

What is your name:aaa
What is your girlfriend's name:www
Your name is aaa & your girlfriend's name is www
String s = "Your name is " + print1() + " & your girlfriend's name is " + print2();
System.out.println(s);
可以进一步细分为:

String s1 = print1();
String s2 = print2();
String s = "Your name is " + s1 + " & your girlfriend's name is " + s2;
System.out.println(s);
如果你看这个,顺序很清楚。这本质上就是正在发生的事情,您只是通过在一条语句中指定所有内容来走捷径

考虑它的第二种方式更具概念性:为了能够构建最终输出字符串并将其传递给
System.out.println()
,您必须知道
print1()
print2()
的返回值是什么,否则无法构建字符串!因此,它们必须首先被执行

如果您想了解技术,Java语言规范中有几个地方描述了这种行为。发件人:

调用方法或构造函数时(§15.12) 实际参数表达式初始化新创建的参数 每个声明类型的变量,在执行 方法或构造函数。


换句话说,Java将在
System.out.println()完成它的工作之前完全构建您的字符串,而在您的情况下,这需要调用您的打印方法。

当您调用display时,display调用print1和print2

display();

public void display(){
    System.out.println("Your name is "+print1()+" & your girlfriend's name is "+print2());

                                        ^^^                                       ^^^
}
在方法返回任何内容之前,将执行print1的操作

public String print1(){
    System.out.print("What is your name:");   // perform before return
    String a=input.next();
    return a;
}
因此,在从print1和print2返回任何内容之前,将执行它们的操作

System.out.println的步骤(“你的名字是“+print1()+”&你女朋友的名字是“+print2())

1) 执行
print1
将值返回到
println
;在
print2
完成之前无法打印行

2) 执行
print2
将值返回到
println

3) 打印返回值为
print1
print2


因此,
println
最终无法执行,因为它的性能取决于对其他方法的调用。一旦这些方法完成它们的操作,那么就可以执行
println

当您调用display时,display调用print1和print2

display();

public void display(){
    System.out.println("Your name is "+print1()+" & your girlfriend's name is "+print2());

                                        ^^^                                       ^^^
}
System.out.println("Your name is "+print1()+" & your girlfriend's name is "+print2());
在方法返回任何内容之前,将执行print1的操作

public String print1(){
    System.out.print("What is your name:");   // perform before return
    String a=input.next();
    return a;
}
因此,在从print1和print2返回任何内容之前,将执行它们的操作

System.out.println的步骤(“你的名字是“+print1()+”&你女朋友的名字是“+print2())

1) 执行
print1
将值返回到
println
;在
print2
完成之前无法打印行

2) 执行
print2
将值返回到
println

3) 打印返回值为
print1
print2

所以