Java 当返回作为参数传递给其他方法时,为什么首先调用方法?
我创建了两个名为clz1(main)和clz2的类 clz1: clz2: 输出如下: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.
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
所以