请帮我理解这段代码。我是java的新手。
// C.java
class C {
public static void main(String arg[]) {
System.out.println("A"+new C());
}
public String toString() {
System.out.print("B");
return "C";
}
}
// output:
// BAC
答案 0 :(得分:9)
评估结果如下:
Call println("A" + new C())
Since new C() hasn't been computed yet, we need to compute it, so...
Compute new C().toString()
Print "B"
Print line with "A" + "C"
如您所见,打印语句的顺序为“B”,“A”,“C”
答案 1 :(得分:6)
您需要了解以下两个概念: Java从左到右评估规则和副作用。
"A"+new C()
遵循同样的规则。首先得到“A”,这是一个字符串文字,把它放在某个地方。然后评估
new C()
首先构造一个C Object
,然后调用C Object的toString()
方法,并获取C对象的值,即“C
”,然后连接“A
}“和”C
“在一起,并打印”AC
“。
在C对象的toString()
方法中,有一个System.out.print("B");
当Java评估上面的表达式时调用它。在评估完成之前打印出来
这就是为什么首先打印“B
”的原因
答案 2 :(得分:2)
因为new C()
转换为字符串,然后传递给println()
。基本上,这是发生的事情:
1. Concatenate "A" with new C():
a. Call String.valueOf(new C()):
i. print "B"
ii. return "C"
b. Concatenate "A" and "C"
2. Pass "AC" to println
3. Print "AC"
AFAIK(我不是100%肯定)字符串连接使用String#valueOf(Object)
而不是直接调用Object#toString()
。这就是为什么"foo" + null
是"foonull"
而不是[throw a NullPointerException]
。