我创建了两个名为clz1(main)& amp; clz2。
clz1:
public class clz1 {
public static void main(String[]args){
clz2 clz2object=new clz2();
clz2object.display();
}
...
}
clz2:
import java.util.Scanner;
public class clz2 {
input=new Scanner(System.in);
public String print1(){
System.out.print("What is your name:");
String a=input.next();
return a;
}
public String print2(){
System.out.print("What is your girlfriend's name:");
String b=input.next();
return b;
}
public void display(){
System.out.println("Your name is "+print1()+" & your girlfriend's name is "+print2());
}
}
,输出如下:
What is your name:aaa
What is your girlfriend's name:www
Your name is aaa & your girlfriend's name is www
怎么可能这样呢?我没有打电话给print1()
和print2()
...首先应该打印“你的名字是”和print1() ....然后“你女朋友的名字是“和print2() ......不是吗?
答案 0 :(得分:3)
你的输出很有意义。您 致电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()
之前发生。
如果此处的操作顺序让您感到困惑,有两种方法可以考虑它。一个是以上可以改写成这样:
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语言规范的几个地方描述了这种行为。来自Section 8.4.1:
当调用方法或构造函数(第15.12节)时,该值的值 实际参数表达式初始化新创建的参数 变量,每个声明的类型,在执行主体之前 方法或构造函数。
换句话说,Java将在System.out.println()
完成其工作之前完全构建您的字符串 - 在您的情况下,这需要调用您的打印方法。
答案 1 :(得分:3)
System.out.println("Your name is "+print1()+" & your girlfriend's name is "+print2());
您确实调用了print1()和print2()。首先在括号中的Java进程代码,然后打印它。 它几乎像:
System.out.println(1+1);
它处理' 1 + 1'首先,然后再打印出来。
答案 2 :(得分:0)
当您呼叫显示时,显示调用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("Your name is "+print1()+" & your girlfriend's name is "+print2());
1)执行
print1
返回值println
;在print2
完成之前无法打印行2)执行
print2
返回值println
3)打印行的返回值为
print1
和print2
最终,println
无法执行,因为它的性能基于对其他方法的调用。一旦这些方法完成了他们的操作,那么println
就可以执行。