我想知道为什么打印以下代码:
Beta 44
44 44
请纠正我,因为我的分析显然不正确,但我无法弄清楚原因。
首先调用 b.h
,然后调用44,然后调用b.getH()并打印" Beta 44"。因此控制台会打印44 Beta 44
。为什么不是这样?
public class Beta {
public int h = 44;
public int getH(){
System.out.println("Beta "+h);
return h;
}
public static void main(String[] args) {
Beta b = new Beta();
System.out.println(b.h+" "+ b.getH());
}
}
答案 0 :(得分:2)
System.out.println(b.h+" "+ b.getH());
StringBuilder builder = new StringBuilder();
String result = builder.append(b.h).append(" ").append(b.getH()).toString();
System.out.println(result);
如您所见,虽然首先评估b.h
,但在从连接构造整个String
值之前不会打印它。该构造涉及调用具有其自己的
b.get()
System.out.println("Beta "+h);
答案 1 :(得分:2)
要在System.out.println(b.h+" "+ b.getH());
中投放main
行,必须先调用b.getH
,然后再System.out.println
。
输出的第一行来自对b.getH
的调用(特别是来自<{1}} 内部的方法)。第二行来自对System.out.println
的封闭式调用。
答案 2 :(得分:2)
Java必须在运算符执行操作之前评估所有必需的参数。
在这种情况下,在b.getH()
连接到b.h + " "
的结果之前调用b.getH()
。
下面,
b.h
与" "
连接,以获得"44 "
。b.getH()
被召唤。getH()
打印"Beta 44"
。getH()
返回44
。44
从步骤(1)连接到"44 "
的末尾,产生"44 44"
,现在已打印出来。答案 3 :(得分:2)
首先调用
b.h
b.h
是一个字段,而不是一个方法,因此它不能被称为#34;。你的代码从中读取的值,得到44,并暂时保存它; 还没有打印出来。
然后调用
b.getH()
并打印&#34; Beta 44&#34;
那是对的 - 这是你获得第一行的方式,即"Beta 44"
因此控制台会打印
44 Beta 44
这不是控制台应该打印的内容,因为"Beta 44"
内的getH()
必须在 b.h+" "+ b.getH()
开始打印之前完成打印。
在获取这两个部分之前,控制台无法开始打印b.h+" "+ b.getH()
。一旦b.getH()
返回,println
已准备好所有部分,即从阅读b.h
获得的44,在其间放置的空间,最后是44在末尾打印。因此,"44 44"
会在第二行打印出来。
答案 4 :(得分:1)
首先b.h+" "+ b.getH()
必须先进行评估才能打印出来。根据您的预期输出,您可以完成类似
public static void main(String[] args) {
Beta b = new Beta();
System.out.print(b.h);
System.out.print(" ");
System.out.println(b.getH());
}
您现有的版本相当于
String temp = b.h+" "+ b.getH();
System.out.println(temp);